[數據結構] 隊列 (Queue)

1.概念

隊列 : 只允許在一段進行插入數據操操作 , 在另一端進行刪除數據操作的特殊線性表 ; 隊列先進先出

入隊列 : 進行插入操作的一端稱為隊尾

出隊列 : 進行刪除操作的一端稱為對頭

2.隊列的使用

在Java中 , Queue 是一個接口 , 底層通過鏈表實現的

方法

行為

說明

add(E e)

添加元素到隊尾(若隊列已滿,拋出 IllegalStateException

推薦使用 offer()

offer(E e)

添加元素到隊尾(隊列滿時返回 false

更安全的插入方式

remove()

移除并返回隊頭元素(隊列空時拋出NoSuchElementException

推薦使用 poll()

poll()

移除并返回隊頭元素(隊列空時返回 null

安全的移除方式

element()

查看隊頭元素(不刪除,隊列空時拋出異常)

推薦使用 peek()

peek()

查看隊頭元素(不刪除,隊列空時返回 null

安全的查看方式

public static void main(String[] args) {Queue<Integer> queue = new LinkedList<>();queue.offer(11);//添加元素到隊尾queue.offer(12);queue.offer(13);queue.offer(14);queue.offer(15);System.out.println(queue);//打印隊列  [11, 12, 13, 14, 15]int a1 = queue.poll();//移除頭元素,并返回System.out.println(a1);//11System.out.println(queue);//[12, 13, 14, 15]int a2 = queue.peek();//獲取隊頭元素System.out.println(a2);//12
}

3.隊列的模擬實現

①實現隊列

public class MyQueue {public static class ListNode{public int val;public ListNode prev;public ListNode next;public ListNode(int val){this.val = val;}}public int usedSize = 0;public ListNode head = null;public ListNode last = null;public boolean isEmpty(){//檢查是否為空return usedSize == 0;//如果是空的 , usedSize為0 返回true}public void offer(int val){//入隊列,采用的是尾插法ListNode node = new ListNode(val);if(isEmpty()){head = last =  node;//把node節點賦值給head和lastusedSize++;}else {last.next = node;node.prev = last;last = node;usedSize++;}}public int poll(){//相應的出隊列應該采用,頭刪法if(isEmpty()) {return -1;}int vall = head.val;head = head.next;if(head != null){head.prev = null;}usedSize--;return vall;}public int size(){//返回大小return usedSize;}}

②測試

public static void main(String[] args) {MyQueue myQueue = new MyQueue();myQueue.offer(11);//添加元素到隊尾myQueue.offer(12);myQueue.offer(13);myQueue.offer(14);myQueue.offer(15);System.out.println(myQueue.poll());
}

4.循環隊列

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

方法名

描述

參數

返回值

特殊說明

MyCircularQueue(k)

構造器,初始化隊列,設置隊列容量為 k

int k(隊列容量)

內部實際使用 k+1 的空間來區分空滿狀態

Front()

獲取隊首元素

int(隊首元素值)

隊列為空時返回 - 1

Rear()

獲取隊尾元素

int(隊尾元素值)

隊列為空時返回 - 1

enQueue(value)

向隊列插入元素

int value(待插入元素)

boolean(插入成功返回 true,隊列滿則返回 false)

插入后隊尾指針循環后移

deQueue()

從隊列刪除隊首元素

boolean(刪除成功返回 true,隊列為空則返回 false)

刪除后隊首指針循環后移

isEmpty()

檢查隊列是否為空

boolean(為空返回 true,否則返回 false)

當 front == rear 時隊列空

isFull()

檢查隊列是否已滿

boolean(已滿返回 true,否則返回 false)

當 (rear+1) % 容量 == front 時隊列滿

class MyCircularQueue {public int front;public int rear;public int[] elem;public MyCircularQueue(int k) {elem = new int[k+1];}//入隊列 public boolean enQueue(int value) {if(isFull()) {return false;}elem[rear] = value;rear = (rear+1)%elem.length;return true;}//出隊列 public boolean deQueue() {if(isEmpty()) {return false;}front = (front+1)%elem.length;return true;}//得到隊頭元素 public int Front() {if(isEmpty()) {return -1;}return elem[front];}public int Rear() {if(isEmpty()) {return -1;}int index = (rear == 0) ? elem.length-1 : rear-1;return elem[index];}public boolean isEmpty() {return rear == front;}public boolean isFull() {return (rear+1)%elem.length == front;}}

5.雙端隊列(Deque)

雙端隊列 是 指允許兩端都可以進行入隊和出隊操作的隊列

Deque是一個接口, 使用時 必須創建LinkedList對象

Deque的接口比較多 , 棧和隊列均可以實現該接口

public static void main(String[] args) {Deque<Integer> stack = new LinkedList<>();//雙端隊列的鏈式實現Deque<Integer> queue = new ArrayDeque<>();//雙端隊列的線性實現
}

6.用隊列實現棧

  1. 模擬的入棧操作 : 將元素放到不為空的隊列中
  2. 模擬的出棧操作 : 把不為空的隊列中的size-1個元素放到另一個隊列中 ; 最后剩下的就是模擬棧中的頂層元素
import java.util.LinkedList;
import java.util.Queue;class MyStackUseQueue {public Queue<Integer> qu1;public Queue<Integer> qu2;public MyStackUseQueue() {qu1 = new LinkedList<>();qu2 = new LinkedList<>();}public void push(int x) {if(!qu1.isEmpty()) {qu1.offer(x);}else if(!qu2.isEmpty()) {qu2.offer(x);}else {qu1.offer(x);}}public int pop() {if(empty()) {return -1;}if(!qu1.isEmpty()) {int size = qu1.size();for(int i = 0;i < size-1;i++) {qu2.offer( qu1.poll());}return qu1.poll();}else  {int size = qu2.size();for(int i = 0;i < size-1;i++) {qu1.offer( qu2.poll());}return qu2.poll();}}public int top() {if(empty()) {return -1;}if(!qu1.isEmpty()) {int size = qu1.size();int val = 0;for(int i = 0;i < size;i++) {val = qu1.poll();qu2.offer(val);}return val;}else  {int size = qu2.size();int val = 0;for(int i = 0;i < size;i++) {val = qu2.poll();qu1.offer(val);}return val;}}public boolean empty() {return qu1.isEmpty() && qu2.isEmpty();}
}

7.用棧實現隊列

  1. 模擬入隊操作 : 放到第一個棧中
  2. 模擬出隊操作 : 判斷第二個棧是否為空 ?

如果為空 : 需要把第一個棧中的所有元素都放到第二個棧里 , 取出第二個棧中的頂層元素

如果不為空 : 直接取出第二個棧中的頂層元素

import java.util.ArrayDeque;class MyQueueUseStack {public ArrayDeque<Integer> stack1;public ArrayDeque<Integer> stack2;public MyQueueUseStack() {stack1 = new  ArrayDeque<>();stack2 = new  ArrayDeque<>();}public void push(int x) {stack1.push(x);}public int pop() {if(empty()) {return -1;}if(stack2.isEmpty()) {//第一個棧里面所有的元素 放到第二個棧當中 while(!stack1.isEmpty()) {stack2.push(stack1.pop());}}return stack2.pop();}public int peek() {if(empty()) {return -1;}if(stack2.isEmpty()) {//第一個棧里面所有的元素 放到第二個棧當中 while(!stack1.isEmpty()) {stack2.push(stack1.pop());}}return stack2.peek();}public boolean empty() {return stack1.isEmpty() && stack2.isEmpty();}
}

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

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

相關文章

從原始數據到高效模型:基礎特征工程的系統指南

基礎特征工程全解析&#xff1a;從原始數據到模型提效的關鍵步驟 在機器學習項目中&#xff0c;有一句被反復提及的話&#xff1a;“數據和特征決定了機器學習的上限&#xff0c;而模型和算法只是逼近這個上限。” 這句話的核心就是在強調 特征工程&#xff08;Feature Enginee…

4-1〔O?S?C?P? ? 研記〕? WEB應用攻擊?目錄遍歷漏洞-A

鄭重聲明&#xff1a; 本文所有安全知識與技術&#xff0c;僅用于探討、研究及學習&#xff0c;嚴禁用于違反國家法律法規的非法活動。對于因不當使用相關內容造成的任何損失或法律責任&#xff0c;本人不承擔任何責任。 如需轉載&#xff0c;請注明出處且不得用于商業盈利。 …

【Linux】歸檔、壓縮、用戶管理

1.歸檔tar(tape archiving program)&#xff0c;最早是一個磁盤歸檔程序。tar命令用于文件的打包&#xff08;歸檔&#xff09;&#xff0c;可以將若干&#x1f608;文件或者目錄&#x1f608;打包成一個文件&#xff0c;既利于文件管理&#xff0c;也方便壓縮和文件的網絡傳輸…

9.18 丑數|換根dp

lc854 偶數之間的奇數個數 差值/2 先都變成偶數 把整個范圍包起來&#xff0c;反正偶數不做數class Solution {public int countOdds(int low, int high) {if(low % 2 1){--low;}if(high % 2 1){high;}return (high - low) / 2;} }lc17.10摩爾投票class Solution { public:i…

PHP通過命令行調用Ghostscript把pdf轉換成圖片集

1.使用命令行在服務器上安裝Ghostscript&#xff0c;網上教程很多按步驟操作就行。2.使用php執行命令行。/*** 使用Ghostscript命令行轉換PDF為圖片** param string $pdfUrl PDF文件URL* param string $folderName 存儲目錄名 (默認值&#xff1a;wenjianming)** return ar…

Spring Boot `@Service` 互相調用全攻略:`@Autowired` vs `@Resource`

Spring Boot Service 互相調用全攻略&#xff1a;Autowired vs Resource 在日常寫 Spring Boot 項目的時候&#xff0c;經常會遇到一個問題&#xff1a;多個 Service 之間需要互相調用&#xff0c;到底該怎么寫才優雅&#xff1f;用 Autowired&#xff1f;用 Resource&#xf…

c過渡c++應知應會(2)

c過渡c應知應會&#xff08;2&#xff09;1.缺省參數2.函數重載3.引用4.inline1.缺省參數 缺省參數是聲明或定義函數時為函數的參數指定一個缺省值。在調用該函數時&#xff0c;如果沒有指定實參&#xff0c;則采用該形參的缺省值&#xff0c;否則使用指定的實參&#xff0c;缺…

SSH連接排故排查

文章目錄SSH連接排故排查案例1&#xff1a;解決思路排故過程故障模擬SSH連接排故排查 案例1&#xff1a; 你是某在線教育公司的運維工程師&#xff0c;負責維護 3 臺應用服務器。今日上午 9 點&#xff0c;開發團隊反饋無法通過 SSH 連接 10.1.8.10 服務器部署代碼。該服務器…

Python爬蟲實戰——使用NetNut網頁解鎖器獲取亞馬遜電商數據的入門指南

摘要在當今數字化時代&#xff0c;電商數據蘊含著巨大的商業價值。亞馬遜作為全球知名的電商平臺&#xff0c;其上的商品信息、用戶評價等數據對于市場分析、競品研究等具有重要意義。然而&#xff0c;由于反爬蟲機制的存在&#xff0c;直接獲取亞馬遜電商數據并非易事。本文將…

汽車多核架構中內存系統故障檢測的改進算法

摘要隨著半導體行業向納米級方向發展&#xff0c;多核架構已成為主流趨勢。然而&#xff0c;這一趨勢也使得多核處理器面臨諸多挑戰&#xff0c;在一定程度上限制了其性能發揮。目前&#xff0c;汽車行業中的混合安全關鍵型系統普遍采用多核處理器。為滿足新興自動駕駛等級的需…

VastBase數據庫Crash后使用gdb收集coredump信息

VastBase數據庫Crash后使用gdb收集coredump信息&#x1f418; 數據庫版本&#xff1a;VastBase G100 V3.0.8檢查數據庫崩潰后生成的core文件&#xff1a; [vbdbadbhost vastbase]$ ll -h core* -rw------- 1 vbdba vbdba 62G Aug 20 20:02 core-vastbase-162199-2025_08_20_19_…

【LeetCode 每日一題】2749. 得到整數零需要執行的最少操作數

Problem: 2749. 得到整數零需要執行的最少操作數 文章目錄整體思路完整代碼時空復雜度時間復雜度&#xff1a;O(1)空間復雜度&#xff1a;O(1)整體思路 這段代碼旨在解決一個具有數學和位運算性質的問題&#xff1a;給定兩個整數 num1 和 num2&#xff0c;找到最小的正整數 k&…

安卓開發工程師中高級知識點 —— 系統底層安全方向

一、AIDL 通信 Android Interface Definition Language 基于 Binder 實現跨進程通信&#xff08;IPC&#xff09;&#xff0c;核心是通過定義接口生成代理類&#xff0c;屏蔽底層 Binder 通信細節 適用于跨進程服務調用&#xff08;如系統服務、多App協作&#xff09;。常見于后…

動環監控系統-機房高效運維

動環監控系統&#xff08;全稱為動力環境監控系統&#xff09;是機房高效運維的核心工具&#xff0c;通過集成動力、環境、安防、IT設備等模塊&#xff0c;結合智能告警、AI分析、3D可視化等技術&#xff0c;實現機房的全方位監控與管理。動力系統監控供電設備&#xff1a;實時…

知微傳感Dkam系列3D相機SDK例程篇:CSharp設置相機工作模式

設置3D相機觸發模式 寫在前面 本人從事機器視覺細分的3D相機行業。編寫此系列文章主要目的有&#xff1a; 1、便利他人應用3D相機&#xff0c;本系列文章包含公司所出售相機的SDK的使用例程及詳細注釋&#xff1b;2、促進行業發展及交流。設置觸發模式及API說明 觸發模式說明 知…

PHP 常用函數及用法

文章目錄PHP 常用函數及用法一、字符串處理函數1. 字符串基礎操作2. 字符串查找與替換3. 字符串分割與連接4. 字符串大小寫轉換5. 字符串格式化二、數組操作函數1. 數組基礎操作2. 數組遍歷與查找3. 數組修改與排序4. 數組過濾與合并三、文件操作函數1. 文件讀寫2. 文件和目錄信…

yum命令--obsoletes與--allowerasing兩者的區別

在 YUM&#xff08;Yellowdog Updater Modified&#xff09;包管理工具中&#xff0c;–obsoletes 和 --allowerasing 是兩個與包升級 / 安裝相關的選項&#xff0c;它們的功能和使用場景有明顯區別&#xff1a; 1. --obsoletes&#xff08;默認啟用&#xff09;作用&#xff1…

Day24_【深度學習(3)—PyTorch使用(1)—張量的創建和類型轉換】

一、創建張量1.張量基本創建方式torch.tensor 根據指定數據創建張量 &#xff08;最重要&#xff09;torch.Tensor 根據形狀創建張量, 其也可用來創建指定數據的張量torch.IntTensor、torch.FloatTensor、torch.DoubleTensor 創建指定類型的張量1.1 torch.tensor# 方式一&…

阿里云圖像編輯大模型開發部署

與阿里云一起輕松實現數智化讓算力成為公共服務&#xff1a;用大規模的通用計算&#xff0c;幫助客戶做從前不能做的事情&#xff0c;做從前做不到的規模。讓數據成為生產資料&#xff1a;用數據的實時在線&#xff0c;幫助客戶以數據為中心改變生產生活方式創造新的價值。圖像…

查看磁盤分區并新建一個分區,掛載分區

linux系統磁盤df -h查看文件系統的磁盤的空間占用情況&#xff0c;常用于快速檢查磁盤使用率&#xff1a;df -h-h是說把磁盤空間以G位單位&#xff0c;如果直接用df也是可以的&#xff0c;只不過單位是塊&#xff0c;看的不明顯du -sh /home/查看/home目錄下總共占用了多大的空…