【Java數據結構】詳解Stack與Queue(三)

🔒文章目錄:

1.????前言~🥳🎉🎉🎉

2. 隊列(Queue)

2.1隊列的概念?

2.2隊列的方法?

2.3隊列的使用?

2.4循環隊列

循環隊列的介紹

循環隊列圖

如何區分循環隊列是滿還是空?

數組下標循環技巧?

模擬實現循環隊列

3.雙端隊列(Deque)?

4.總結


1.????前言~🥳🎉🎉🎉

Hello, Hello~ 親愛的朋友們👋👋,這里是E綿綿呀????。

如果你喜歡這篇文章,請別吝嗇你的點贊????和收藏📖📖。如果你對我的內容感興趣,記得關注我👀👀以便不錯過每一篇精彩。

當然,如果在閱讀中發現任何問題或疑問,我非常歡迎你在評論區留言指正🗨?🗨?。讓我們共同努力,一起進步!

加油,一起CHIN UP!💪💪

🔗個人主頁:E綿綿的博客
📚所屬專欄:

1.?JAVA知識點專欄

? ? ?? ?深入探索JAVA的核心概念與技術細節

2.JAVA題目練習

? ? ? ??實戰演練,鞏固JAVA編程技能

3.c語言知識點專欄

? ? ? ? 揭示c語言的底層邏輯與高級特性

4.c語言題目練習

? ? ? ? 挑戰自我,提升c語言編程能力

📘 持續更新中,敬請期待????


借鑒文章:【Java---數據結構】隊列-CSDN博客?

2. 隊列(Queue)

2.1隊列的概念?

隊列:只允許在一端進行插入數據操作,在另一端進行刪除數據操作的特殊線性表,隊列具有先進先出FIFO(First In First Out) 入隊列:進行插入操作的一端稱為隊尾(Tail/Rear) 出隊列:進行刪除操作的一端稱為隊頭 (Head/Front)

2.2隊列的方法?


常用的方法為以上三個方法,但總共有六個方法。

🍓入隊列:add()、offer()

相同:未超出容量,從隊尾壓入元素,返回壓入的那個元素。
區別:在超出容量時,add()方法會對拋出異常,offer()返回false
🍓出隊列:remove()、poll()

相同:容量大于0的時候,刪除并返回隊頭被刪除的那個元素。
區別:在容量為0的時候,remove()會拋出異常,poll()返回null
🍓獲取隊頭元素(不刪除):element()、peek()

相同:容量大于0的時候,都返回隊頭元素。但是不刪除。
區別:容量為0的時候,element()會拋出異常,peek()返回null。

雖然有六個方法,但我們經常用的是 offer(),poll(),peek()。知道這另外三個方法就行了

此外我們還需記住size()和isEmpty(),這兩個方法之前就見過,想必不用多說了。

2.3隊列的使用?

由于隊列是接口,所以我們不能實例化Queue,要用Queue去接收實現了Queue接口的實例化對象。

隊列可以使用順序表或鏈表的結構來實現:

當用鏈表結構來實現時,我們用LinkedList去實例化對象,再用Queue去接收。(LinkedList實現了Queue接口,上圖有出現其關系)

當用順序表結構來實現時,我們用ArrayDeque去實例化對象,再用Queue去接收。

(ArrayDeque實現了Queue接口)

?當用鏈表結構實現隊列時,其使用代碼如下:

public class Test1 {public static void main(String[] args) {Queue<Integer> queue=new LinkedList<>();queue.offer(4);queue.offer(3);queue.offer(2);queue.offer(1);System.out.println(queue.peek());queue.poll();queue.poll();System.out.println(queue);}
}


當用順序表結構實現隊列時,其使用代碼如下:?

public class Test2 {public static void main(String[] args) {Queue<Integer> queue=new ArrayDeque<>();queue.offer(4);queue.offer(3);queue.offer(2);queue.offer(1);System.out.println(queue.peek());queue.poll();queue.poll();System.out.println(queue);}
}


注意:我們用println()打印Queue對象時能以字符串的形式打印出其內部的所有成員值。

2.4循環隊列

循環隊列的介紹

當我們使用順序表實現隊列時,會存在一個問題:雖然順序表實現的隊列可以自動擴容,但其空間利用不充分:因為每次出隊都會浪費一個空間,為了解決這個問題,我們可以采用循環隊列。
循環隊列是一個特殊的隊列:其底層還是數組,但不能實現自動擴容。入隊時能夠重新從數組的尾部跳到數組頭部對已經出隊的空間重新利用,這樣就能夠保證數組的每一個空間都可以被利用。

?循環隊列圖

如果將隊列看做是一個循環,那么就可以看做是將數據存儲在一個圓環里。


那現在有一個問題,當隊列(數組)滿的時候,font = rear ,而空的時候也是font=rear。那該怎么判斷呢?

如何區分循環隊列是滿還是空?

1、定義一個變量size:記錄隊列元素個數。

每存放(入隊)一個元素size++,每刪除(出隊)一個元素size--。
當size的值與順序表的大小相等時,表示隊列已滿。
size值為0表示隊列為空。

2、使用一個boolean類型的成員變量flag進行標記,初始值為false

每次入隊時將flag的值置為true,出隊將flag的值置為false,
當rear == front && flag == true表示隊列已滿。
當rear == front && flag == false表示隊列為空。

3、浪費一個空間。

每次存放元素之前都先檢查一下rear的下一個下標與 front 是否相等(也可以使用格式進行判斷:(rear+1)% array.length 是否與 front 相等)
如果rear的下一個下標與 front 相等則表示隊列已滿。
如果rear == front則表示隊列為空。

這樣就導致其中必有一個空間存放不了值,相當于浪費了一個空間去使隊列為空的標志和隊列已滿的標志有區別,從而使其能夠判斷出來。

數組下標循環技巧?

?同理在出隊時,front 也會出現這種情況,所以使用方式:front = (front+1)%elem.length;

?模擬實現循環隊列

📌題目描述:


設計你的循環隊列實現。 循環隊列是一種線性數據結構,其操作表現基于 FIFO(先進先出)原則并且隊尾被連接在隊首之后以形成一個循環。它也被稱為“環形緩沖器”。
循環隊列的一個好處是我們可以利用這個隊列之前用過的空間。在一個普通隊列里,一旦一個隊列滿了,我們就不能插入下一個元素,即使在隊列前面仍有空間。但是使用循環隊列,我們能使用這些空間去存儲新的值。


你的實現應該支持如下操作:

MyCircularQueue(k): 構造器,設置隊列長度為 k 。
Front: 從隊首獲取元素。如果隊列為空,返回 -1 。
Rear: 獲取隊尾元素。如果隊列為空,返回 -1 。
enQueue(value): 向循環隊列插入一個元素。如果成功插入則返回真。
deQueue(): 從循環隊列中刪除一個元素。如果成功刪除則返回真。
isEmpty(): 檢查循環隊列是否為空。
isFull(): 檢查循環隊列是否已滿。

📋題目示例?:

MyCircularQueue circularQueue = new MyCircularQueue(3); // 設置長度為 3
circularQueue.enQueue(1); ?// 返回 true
circularQueue.enQueue(2); ?// 返回 true
circularQueue.enQueue(3); ?// 返回 true
circularQueue.enQueue(4); ?// 返回 false,隊列已滿
circularQueue.Rear(); ?// 返回 3
circularQueue.isFull(); ?// 返回 true
circularQueue.deQueue(); ?// 返回 true
circularQueue.enQueue(4); ?// 返回 true
circularQueue.Rear(); ?// 返回 4

💥注意:

? 代碼示例:

class MyCircularQueue {Integer[] elements;int font;int rear;public MyCircularQueue(int k) {elements =new Integer[k+1];}public boolean enQueue(int value) {if(isFull())return false;else {elements[rear] = value;rear = (rear + 1) % elements.length;return true;}}public boolean deQueue() {if(isEmpty())return false;else{elements[font]=null;font=(font+1)%elements.length;return true;}}public int Front() {if (isEmpty())return -1;elsereturn elements[font];}public int Rear() {if(isEmpty())return -1;else{if(rear==0)return elements[elements.length-1];return elements[rear-1];}}public boolean isEmpty() {if(rear==font)return true;elsereturn false;}public boolean isFull() {if((rear+1)%elements.length==font)return true;elsereturn false;}
}

該題鏈接:循環隊列的模擬實現

3.雙端隊列(Deque)?

雙端隊列(deque)是指允許兩端都可以進行入隊和出隊操作的隊列,deque 是 “double ended queue” 的簡稱。

將隊列的兩端分別稱為前端和后端,兩端都可以入隊和出隊。所以雙端隊列既能夠當隊列使用,也能當棧使用。(重點這句話)

Java底層是使用LinkedList或ArrayDeque來實現雙端隊列(Deque)的,前面講過,隊列(Queue)也是使用LinkedList或ArrayDeque來實現的。(使用LinkedList是用鏈式結構去實現雙端隊列,使用ArrayDeque是用順序結構去實現雙端隊列)

對于Deque的方法,我們常見的依舊是offerFirst,offerLast,pollFirst,pollLast,peekFirst,peekLast。其他的六個方法知道就行。?

除此之外我們也還需記住size()和isEmpty()。


?當用鏈表結構實現雙端隊列時,其使用代碼如下:

public class Test3 {public static void main(String[] args) {Deque<Integer> deque= new  LinkedList<>();deque.offerLast(4);deque.offerFirst(3);deque.offerFirst(5);deque.offerLast(6);System.out.println(deque.peekLast());//6System.out.println(deque.peekFirst());//5deque.pollLast();deque.pollFirst();System.out.println(deque.peekLast());//4System.out.println(deque.peekFirst());//3}
}


?當用順序表結構實現雙端隊列時,其使用代碼如下:

public class Test4 {public static void main(String[] args) {Deque<Integer> deque= new ArrayDeque<>();deque.offerLast(4);deque.offerFirst(3);deque.offerFirst(5);deque.offerLast(6);System.out.println(deque.peekLast());//6System.out.println(deque.peekFirst());//5deque.pollLast();deque.pollFirst();System.out.println(deque.peekLast());//4System.out.println(deque.peekFirst());//3
}
}

4.總結

所以這篇文章我們就把隊列的概念講完了,下篇文章將帶來隊列和棧的習題練習。在此,我們誠摯地邀請各位大佬們為我們點贊、關注,并在評論區留下您寶貴的意見與建議。讓我們共同學習,共同進步,為知識的海洋增添更多寶貴的財富!🎉🎉🎉????💕💕🥳👏👏👏

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

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

相關文章

外掛知識庫的基本知識與內容

外掛知識庫 1.什么是rag&#xff1f; RAG,即LLM在回答問題或生成文本時&#xff0c;會先從大量文檔中檢索出相關的信息&#xff0c;然后基于這些信息生成回答或文本&#xff0c;從而提高預測質量。 2.外掛知識庫的實現思路 只用幾十萬量級的數據對大模型進行微調并不能很好…

第五十六周:文獻閱讀

目錄 摘要 Abstract 文獻閱讀&#xff1a;應用于地表水總磷濃度預測的可解釋CEEMDAN-FE-LSTM-Transformer混合模型 一、現有問題 二、提出方法 三、方法論 1、CEEMDAN&#xff08;帶自適應噪聲的完全包絡經驗模式分解&#xff09; 2、FE&#xff08;模糊熵 &#xff09…

Vue3【十】07使用ref創建基本類型的響應式數據以及ref和reactive區別

Vue3【十】07使用ref創建基本類型的響應式數據以及ref和reactive區別 ref 也可以創建對象類型的響應式數據&#xff0c;不過要使用.value ref 處理對象數據的時候&#xff0c;底層數據還是reactive格式的 reactive 重新分配一個新對象&#xff0c;會失去響應式可以使用Object.a…

自注意力機學習

自注意力機制的核心概念 1. Query, Key 和 Value Query&#xff08;查詢向量&#xff09;&#xff1a;可以看作是你當前在關注的輸入項。假設你正在閱讀一段文字&#xff0c;這就像你當前在讀的句子。 Key&#xff08;鍵向量&#xff09;&#xff1a;表示其他所有輸入項的標識…

保姆級 | MySQL的安裝配置教程(非常詳細)

一、下載Mysql 官網步驟 MySQLhttps://www.mysql.com/進入官網首頁 點擊DOWNLOADS 點擊MySQL Community (GPL) Downloads 點擊 小頁面直接進入 MySQL :: Download MySQL Installerhttps://dev.mysql.com/downloads/installer/點擊“Download”下載最新版本&#xff0c;其他…

【吊打面試官系列】MySQL 中 InnoDB 支持的四種事務隔離級別名稱,以及逐級之間的區別?

大家好&#xff0c;我是鋒哥。今天分享關于 【MySQL 中 InnoDB 支持的四種事務隔離級別名稱&#xff0c;以及逐級之間的區別&#xff1f;】面試題&#xff0c;希望對大家有幫助&#xff1b; MySQL 中 InnoDB 支持的四種事務隔離級別名稱&#xff0c;以及逐級之間的區別&#xf…

碳素鋼化學成分分析 螺紋鋼材質鑒定 鋼材維氏硬度檢測

碳素鋼的品種主要有圓鋼、扁鋼、方鋼等。經冷、熱加工后鋼材的表面不得有裂縫、結疤、夾雜、折疊和發紋等缺陷。尺寸和允許公差必須符合相應品種國家標準的要求。 具體分類、按化學成分分類 &#xff1a; 碳素鋼按化學成分&#xff08;即以含碳量&#xff09;可分為低碳鋼、中…

機器學習筆記 - stable diffusion web-ui安裝教程

一、Stable Diffusion WEB UI 屌絲勁發作了,所以本地調試了Stable Diffusion之后,就去看了一下Stable Diffusion WEB UI,網絡上各種打包套件什么的好像很火。國內的也就這個層次了,老外搞創新,國內跟著屁股后面搞搞應用層,就叫大神了。 不扯閑篇了,我們這里從git源碼直接…

問題:11單位內部人員對行政機關作出的行政處分不服,可申請行政復議. #其他#微信

問題&#xff1a;11單位內部人員對行政機關作出的行政處分不服,可申請行政復議. 參考答案如圖所示

問題:脾梗塞時,下列情況最符合的是 #職場發展#知識分享#媒體

問題&#xff1a;脾梗塞時,下列情況最符合的是 A、脾腫大 B、脾區摩擦感 C、兩者均有 D、兩者均無 參考答案如圖所示

uniapp視頻組件層級太高,解決方法使用subNvue原生子體窗口

目錄 前言 先看一下uniapp官網的原話&#xff1a; subNvue的一些參數介紹 subNvues使用方法&#xff1a; 綁定id 顯示 subNvue 彈出層 subNvue.show() 參數信息 subNvue.hide() 參數信息 在使用subNvue 原生子體窗口 遇到的一些問題 前言 nvue 兼容性 以及使用方式 控…

基于 中間件 的 數據交換平臺 的實現

一、介紹 A. 背景和目的 隨著云計算、大數據和物聯網等技術的快速發展&#xff0c;企業面臨著越來越多的數據交換和集成需求。不同系統之間的數據交換變得越來越復雜&#xff0c;而且數據量也越來越大&#xff0c;這對傳統的數據交換方式提出了更高的要求。 中間件作為一種能…

把ROS程序作為桌面圖標雙擊啟動

1 寫launch文件 把ROS程序寫成一個launch文件&#xff0c;例如 powerline_with_rviz.launch <launch><!-- Load camera parameters --><rosparam file"$(find choose_powerline)/config/camera_params.yaml" command"load"/><!-- …

深入理解并應用KTT求解約束性極值問題

KT 很簡單&#xff0c;口訣記心端&#xff0c;等式求最優&#xff0c;不等式驗證——小飛打油 以后每期嘗試編一句口訣&#xff0c;幫助大家記憶&#xff0c;可以是打油詩&#xff0c;也可以是類似“奇變偶不變&#xff0c;符號看象限”的口訣&#xff0c;如果編的不好&#xf…

2024年6月7日第十五周下午學習英語六級大綱

下午學習英語六級大綱的內容可以歸納為以下幾個主要方面&#xff1a; 一、考試概述 六級考試的對象&#xff1a;修完大學英語相應階段課程的在校大學生。考試目的&#xff1a;參照《大學英語教學指南》設定的教學目標&#xff0c;對我國大學生英語綜合運用能力進行科學測量&a…

Docker 常用命令以及鏡像選擇

目錄 1.Docker基本組成 2.鏡像選擇 2.1、鏡像推薦選擇方案 2.2版本選擇 3.Docker 命令 3.1鏡像管理 拉取鏡像&#xff1a; 列出鏡像&#xff1a; 刪除鏡像&#xff1a; 構建鏡像&#xff1a; 3.2容器管理 運行容器 列出運行中的容器和所有容器 停止容器 啟動重啟…

【Qt】QPushButton 與 QAction 的區別

1. QPushButton QPushButton 是一個界面控件&#xff0c;能顯示到界面上的。QPushButton 是 QWidget的一個子類&#xff0c;是一個表示按鈕的界面控件。它用于在GUI中提供一個標準的按鈕&#xff0c;用戶可以點擊它來觸發一個即時的動作或命令。按鈕可以顯示文本、圖標或兩者都…

為什么要將Modbus轉成MQTT

什么是Modbus Modbus 是一種串行通信協議&#xff0c;最初由Modicon&#xff08;現在的施耐德電氣Schneider Electric&#xff09;于1979年開發&#xff0c;用于可編程邏輯控制器&#xff08;PLC&#xff09;之間的通信。Modbus協議設計簡單&#xff0c;易于部署和維護&#xf…

從零入手人工智能(2)——搭建開發環境

1.前言 作為一名單片機工程師&#xff0c;想要轉型到人工智能開發領域的道路確實充滿了挑戰與未知。記得當我剛開始這段旅程時&#xff0c;心中充滿了迷茫和困惑。面對全新的領域&#xff0c;我既不清楚如何入手&#xff0c;也不知道能用人工智能干什么。正是這些迷茫和困惑&a…

用Python實現奇怪的瘋狂按鍵需求

項目背景 說起來好笑,假設有一個奇怪需求 — 僅僅是假設,不代表我有這個需求,雖然可以想象有人會有這個需求,但是這個人不是我,我也不認識任何這樣的人 — 瘋狂向某個程序輸出按鍵,比如,一會兒瘋狂輸入f,一會兒瘋狂輸入q。 如果是兩個按鍵需求,我想要設置一個最簡單…