數據結構——隊列(Java)

一.基本概念

隊列用來存儲邏輯關系為“一對一”的數據,是一種“特殊”的線性存儲結構。

特點:

?先進先出:隊列中元素的添加(入隊enqueue)和移除(出隊dequeue)遵循先進先出的原
則。
?端點:隊列有兩個主要的端點——隊頭(front)和隊尾(rear)。隊頭是隊列中最先入隊
的元素所在的位置,而隊尾則是最后入隊的元素所在的位置。

強調:隊列不要混淆,棧是一端開口、另一端封口,元素入棧和出棧遵循“先進后出”原則;隊列是兩端都開口,但元素只能從一端進,從另一端出,且進出隊列遵循“先進先出”的原則。

????????實現方法:

? ? ? ? 1.順序表實現

????????2.鏈表實現

以鏈表的方式為例子

二.鏈表實現隊列

? ? ? ? 隊列的API設計

隊列初始化

? ? ? ?

class Queue <T>
{//結點類class Node{public T data;//存儲數據public Node next;//下一個結點public Node(T data , Node next){this.data = data;this.next = next;}}//創建首結點private Node head;//尾結點private Node last;//隊列個數private int N;public Queue(){this.head =new Node(null,null);this.last =null;this.N =0;}

判斷隊列是否為空

思路分析:用布爾類型,直接返回數量

 //判斷隊列是否為空public boolean isEmpty(){return N == 0;}

獲取隊列個數

思路分析:直接返回數量

//返回隊列元素個數public int size(){return N;}

插入元素

思路分析:

1.如果隊列為空,將頭結點指向新結點

2.創建變量1代替原先尾結點的數據

3.創建一個變量2當尾結點

4.將變量1的next引用指向變量2的值

 //插入元素public void enqueue(T data){//保存當前的尾結點Node oldLast = last;//創建新結點為新的尾結點last = new Node(data, null);//判斷隊列是否為空if(isEmpty()){head.next = last;}else{//將原先尾結點的next指向新結點oldLast.next = last;}N++;}

元素取出

思路分析:根據先進先出原則,我們需要更新頭結點的next所指向的值

 //從隊列拿出一個元素public T dequeue(){//為空,返回nullif(isEmpty()){return null;}//保存當前首結點Node oldFirst = head.next;//將首結點更新到下一個結點head.next = oldFirst.next;N--;//如果隊列被刪除完了,重置Last為nullif(isEmpty()){last = null;}return oldFirst.data;//返回取出元素}

三.用棧來實現隊列

思路分析:

棧是后進先出(LIFO)的數據結構,隊列是先進先出(FIFO)的數據結構。我們可以使用兩個棧,一個用于入隊操作(記為?inStack?),一個用于出隊等操作(記為?outStack?)。?

當執行?push?操作時,直接將元素壓入?inStack?。因為?inStack?只負責接收新元素,就像隊列的尾部接收新元素一樣。?

當執行?pop?和?peek?操作時,需要先判斷?outStack?是否為空。如果?outStack?為空,就將?inStack?中的所有元素依次彈出并壓入?outStack?,此時?outStack?棧頂元素就是隊列的開頭元素(因為?inStack?中先進入的元素會在轉移到?outStack?后處于棧頂)。然后再執行相應的?pop?或?peek?操作。?

執行?empty?操作時,只需判斷?inStack?和?outStack?是否都為空。??

完整代碼

import java.util.Stack;class MyQueue {private Stack<Integer> inStack; // 用于入隊操作的棧private Stack<Integer> outStack; // 用于出隊等操作的棧public MyQueue() {inStack = new Stack<>(); // 初始化入隊棧outStack = new Stack<>(); // 初始化出隊棧}public void push(int x) {inStack.push(x); // 將元素x壓入入隊棧,模擬隊列的入隊操作}public int pop() {if (outStack.isEmpty()) { // 如果出隊棧為空while (!inStack.isEmpty()) { // 當入隊棧不為空時outStack.push(inStack.pop()); // 將入隊棧的元素依次彈出并壓入出隊棧}}return outStack.pop(); // 彈出并返回出隊棧的棧頂元素,即隊列開頭的元素}public int peek() {if (outStack.isEmpty()) { // 如果出隊棧為空while (!inStack.isEmpty()) { // 當入隊棧不為空時outStack.push(inStack.pop()); // 將入隊棧的元素依次彈出并壓入出隊棧}}return outStack.peek(); // 返回出隊棧的棧頂元素,即隊列開頭的元素(不彈出)}public boolean empty() {return inStack.isEmpty() && outStack.isEmpty(); // 判斷入隊棧和出隊棧是否都為空,都為空則隊列空}
}
public class StudentMS4
{public static void main(String[] args){MyQueue myQueue = new MyQueue();//調用pushmyQueue.push(1);myQueue.push(2);//調用peekSystem.out.println("隊列開頭的元素是:"+myQueue.peek());//調用popSystem.out.println("移除并返回隊列開頭的元素:"+myQueue.pop());//調用empty方法System.out.println("隊列是否為空:"+myQueue.empty());}
}

目錄

一.基本概念

特點:

????????實現方法:

二.鏈表實現隊列

? ? ? ? 隊列的API設計

隊列初始化

判斷隊列是否為空

獲取隊列個數

插入元素

元素取出

三.用棧來實現隊列

思路分析:

完整代碼


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/95917.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/95917.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/95917.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【Go】:mac 環境下GoFrame安裝開發工具 gf-cli——gf_darwin_arm64

當前主要是關于gf_darwin_arm64的安裝步驟 如何快速給mac電腦安裝gfgf是什么安裝步驟方法1&#xff1a;去github下載gf-cli去git上下載對應電腦版本的gf-cli驗證下載文件是否二進制文件授予該文件權限方法2&#xff1a;去goframe官網教你下載步驟驗證gf是否安裝成功可能遇到的問…

【新】ApiHug官方文檔-ApiHug Spring Security 擴展-補充說明

概述 在上次說明中我們寫了ApiHug 如何做授權的&#xff0c; 這里有個概念的混淆&#xff0c; 其實 apihug 不是在spring security 上做的安全擴展&#xff0c; 應該是 apihug spring, 安全設計框架&#xff0c; 和本身 spring security 沒有半毛錢關系&#xff0c; 而如果你…

【Flask】測試平臺開發,新增說明書編寫和展示功能 第二十三篇

概述&#xff1a;本篇是接著上一篇&#xff0c;細分出說明書的編寫部分&#xff0c;實現這個功能的需求&#xff0c;是內部很多同事反饋&#xff0c;需要有個地方存工具&#xff0c;并且可以寫說明書&#xff0c;如果需要的人&#xff0c;那么可以在界面上直接下載工具和查看工…

Mac設置中的安全性缺少“任何來源”

問題&#xff1a;用Mac安裝軟件&#xff0c;隱私性與安全性&#xff0c;想切換“任何來源”用來下載網站的app&#xff0c;但是菜單欄找不到“任何來源”選項&#xff0c;無法安裝dmg的文件終端中一行代碼設置出來&#xff1a;sudo spctl --global-disable &#xff08;禁用Mac…

uniapp開發小程序,列表 點擊后加載更多數據

一、需求 1.初始顯示限制:將每頁條數limit改為5,確保初始只顯示5條數據 2.查看更多功能:添加了loadMore方法,點擊"查看更多"時加載下一頁數據 3.實現查看更多功能,點擊后加載更多數據 4.添加loading狀態防止重復請求 添加hasMore狀態判斷是否還有更多數據 …

Windows 部署 Gerrit 與 Apache24 配置

Windows 部署 Gerrit 與 Apache24 并配置反向代理 準備工作 下載并安裝 Java JDK 確保配置 JAVA_HOME 環境變量博主這里安裝openjdk21 https://jdk.java.net/archive/下載所需軟件 Apache24&#xff1a;https://httpd.apache.org/download.cgi Gerrit&#xff1a;https://www.g…

從 Excel 趨勢線到機器學習:拆解 AI 背后的核心框架?

引言&#xff1a;你其實早就 “玩轉” 過機器學習&#xff1f;提到 “機器學習”&#xff0c;你是不是第一時間聯想到復雜的代碼、密密麻麻的公式&#xff0c;還有那些讓人頭暈的 “算法”“模型”“訓練” 術語&#xff1f;仿佛它是高高在上的技術&#xff0c;離我們的日常無比…

Lenovo聯想YOGA Pro 16 IAH10 2025款筆記本電腦(83L0)開箱狀態預裝OEM原廠Win11系統

適用機型(MTM)&#xff1a;【83L0】 鏈接&#xff1a;https://pan.baidu.com/s/1tDpeBb93t1u0XIgqAZ3edg?pwdqy2r 提取碼&#xff1a;qy2r 聯想原裝系統自帶所有驅動、出廠主題壁紙、系統屬性聯機支持標志、系統屬性專屬LOGO標志、Office辦公軟件、聯想瀏覽器、電腦管家、…

Android 開發 - 一些畫板第三方庫(DrawBoard、FingerPaintView、PaletteLib)

一、DrawBoard 1、Dependencies 模塊級 build.gradle implementation com.github.jenly1314:drawboard:1.1.02、Test &#xff08;1&#xff09;Activity Layout activity_draw_board.xml <?xml version"1.0" encoding"utf-8"?> <LinearLayout …

捷多邦揭秘超厚銅板:從制造工藝到設計關鍵環節?

一、超厚銅板制造工藝要點超厚銅板&#xff08;3oz 及以上&#xff09;的制造工藝對精度和穩定性要求嚴苛&#xff0c;核心環節需突破多重技術壁壘。蝕刻工藝中&#xff0c;因銅箔厚度達 105μm 以上&#xff0c;需采用高濃度酸性蝕刻液&#xff08;氯化銅濃度控制在 180-220g/…

【MYSQL | 高級篇 MyCat實現分庫分表】

摘要&#xff1a;本文圍繞分庫分表展開&#xff0c;先分析單庫性能瓶頸&#xff0c;介紹垂直與水平拆分策略及實現技術&#xff0c;再詳述 MyCat 中間件的概述、環境準備、目錄結構&#xff0c;講解其入門配置與測試&#xff0c;深入說明核心配置文件&#xff0c;最后演示垂直和…

Docker部署Drawnix開源白板工具

Drawnix簡介 Drawnix 是一款開源的在線白板工具&#xff08;SaaS&#xff09;&#xff0c;集思維導圖、流程圖繪制、自由畫圖等多種功能于一體&#xff0c;支持協作與插件擴展&#xff0c;適用于個人創作、團隊協作和遠程辦公場景。它完全免費且開源&#xff0c;提供豐富的編輯…

Griffin|增強現實數據集|無人機數據集

Griffin|增強現實數據集|無人機數據集 數據來源&#xff1a;huggingface 百度網盤 構建方式 Griffin數據集的構建采用了模塊化架構&#xff0c;結合了CARLA和AirSim平臺&#xff0c;通過模擬真實世界中的無人駕駛環境和無人機動態&#xff0c;收集了超過30,000幀圖像數據&am…

力扣.1054距離相等的條形碼力扣767.重構字符串力扣47.全排列II力扣980.不同路徑III力扣509.斐波那契數列(記憶化搜索)

目錄 力扣.1054距離相等的條形碼 力扣767.重構字符串 力扣47.全排列II 力扣980.不同路徑III 力扣509.斐波那契數列&#xff08;記憶化搜索) 力扣.1054距離相等的條形碼 是否策略正確 但是假如 1 2 2 此時 1_2 此時中間只能填寫2&#xff0c;但是就不對了&#xff0c;所…

「docker」二、3分鐘快速理解docker核心要素

上一節中我們知道docker的作用&#xff0c;這節我們介紹一下docker的要素。 鏡像 docker的核心要素里面有個叫鏡像&#xff08;images&#xff09;的概念&#xff0c;鏡像的作用就類似我們安裝虛擬機用到的iso鏡像文件。鏡像里包含了我們要運行的應用&#xff0c;如&#xff…

搭建基于 Solon AI 的 Streamable MCP 服務并部署至阿里云百煉

一、快速搭建 Solon 項目&#xff0c;引入 Solon AI 1. 開發環境準備 JDK 8 或以上版本。Maven 3.8.6 或以上版本。通義千問 API Key&#xff08;用于模型調用&#xff09;。 2. 創建名為 mcp-server-demo 的項目 創建時選擇 Archetype 為 Solon AI&#xff08;可以減少些活&am…

免費的SSL和付費SSL 證書差異

免費的 SSL 和付費的 SSL&#xff08;TLS 證書&#xff09;本質上提供的加密能力是一樣的&#xff0c;因為 SSL/TLS 協議本身是開放標準&#xff0c;核心加密算法不會因為是否收費而不同。主要區別在于以下幾個方面&#xff1a;&#x1f511; 1. 加密強度免費 SSL&#xff1a;一…

代碼隨想錄算法訓練營第六天 -- 字符串1 || 344.反轉字符串I / 541.反轉字符串II / kamacoder54.替換數字--第八期模擬筆試

代碼隨想錄算法訓練營第六天 -- 字符串1 || 344.反轉字符串I / 541.反轉字符串II / kamacoder54.替換數字--第八期模擬筆試344.反轉字符串I思路541.反轉字符串II題目理解解題思路邊界細節reverse()函數的實現[kamacoder54.替換數字 -- 第八期模擬筆試](https://kamacoder.com/p…

計算機視覺——光流法

系列文章目錄 本系列開篇文章&#xff0c;暫時沒有目錄啦&#xff5e; 文章目錄系列文章目錄前言一、問題假設二、方程推導三、計算Ix,Iy,ItI_x,I_y,I_tIx?,Iy?,It?四、計算光流u,vu,vu,v4.1 傳統算法Lucas-Kanade算法五、孔徑問題5.1 直觀理解5.2 數學角度5.3 解決方法總結…

前端安全攻防:XSS, CSRF 等防范與檢測

前端安全攻防&#xff1a;XSS, CSRF 等防范與檢測在Web應用日益普及的今天&#xff0c;前端安全已經成為一個不容忽視的重要環節。隨著攻擊技術的不斷演進&#xff0c;各種前端安全漏洞&#xff08;如跨站腳本攻擊 XSS、跨站請求偽造 CSRF 等&#xff09;層出不窮&#xff0c;它…