數據結構之隊列:原理與應用

一、基本原理

  • 隊列是一種特殊的線性表
  • 隊列是一個有序表(可以用數組或鏈表實現)
  • 遵循“先來先服務”的原則,它只允許在表的前端(隊頭)進行刪除操作,在表的后端(隊尾)進行插入操作

(一) 核心操作

  • 入隊(Enqueue):在隊尾添加元素。
  • 出隊(Dequeue):從隊頭移除元素。
  • 查看隊頭(Front):獲取隊頭元素但不移除。
  • 判空(IsEmpty):檢查隊列是否為空。

隊列的邏輯結構類似于現實中的排隊場景,例如超市收銀或銀行叫號系統,先到達的顧客優先服務。

(二) 代碼示例

import java.util.LinkedList;
import java.util.Queue;public class Main {public static void main(String[] args) {// 創建一個隊列Queue<Integer> queue = new LinkedList<>();// 入隊queue.offer(10);queue.offer(20);System.out.println("隊列大小: " + queue.size());// 輸出 2// 出隊int front = queue.poll();System.out.println("出隊元素: " + front);  // 輸出 10// 查看隊列的頭元素但不移除它int peek = queue.peek();System.out.println("隊列頭元素: " + peek);  // 輸出 20// 檢查隊列是否為空boolean isEmpty = queue.isEmpty();System.out.println("隊列是否為空: " + isEmpty);  // 輸出 false}
}public interface Queue<E> extends Collection<E> {//插入元素,成功返回true,失敗拋出異常boolean add(E e);//插入元素,成功返回true,失敗返回false或拋出異常 boolean offer(E e);//取出并移除頭部元素,空隊列拋出異常 E remove();//取出并移除頭部元素,空隊列返回null E poll();//取出但不移除頭部元素,空隊列拋出異常 E element();//取出但不移除頭部元素,空隊列返回null E peek();//刪除并返回隊頭元素,當隊列為空,則會阻塞等待E take();
}

二、基本類型

  1. 雙端隊列(Deque)
    • 支持在隊頭和隊尾同時進行插入和刪除操作,靈活性更高。
  1. 優先隊列(Priority Queue)
    • 元素按優先級出隊,而非順序,適用于任務調度等需要優先級處理的場景。
  1. 阻塞隊列
    • 在隊列為空時,出隊操作阻塞;在隊列滿時,入隊操作阻塞,適用于多線程同步場景。

三、實現方式

隊列的實現主要有兩種方式,各自適用于不同場景:

  1. 數組實現(順序隊列)
    • 特點:使用固定大小的數組存儲元素,通過兩個指針(frontrear)分別標記隊頭和隊尾。
    • 問題:當rear指針到達數組末尾時,若隊頭有空閑位置,無法直接利用,導致“假溢出”。
    • 優化方案:引入循環隊列,通過模運算實現指針的循環移動,從而高效利用數組空間。
  1. 鏈表實現(鏈式隊列)
    • 特點:使用動態鏈表存儲元素,無需預先分配固定大小,通過兩個指針(headtail)分別指向隊頭和隊尾。
    • 優勢:空間利用率高,適合元素數量不確定或動態變化的場景。

四、復雜度分析

  • 時間復雜度
    • 入隊(Enqueue):O(1)(數組和鏈表實現均高效)。
    • 出隊(Dequeue):O(1)(鏈表實現直接操作頭節點;數組實現需移動指針,但循環隊列優化后仍為O(1))。
  • 空間復雜度
    • 數組實現:固定大小,可能浪費空間或溢出。
    • 鏈表實現:動態分配,空間利用率高,但需額外指針存儲空間。

五、應用場景

隊列在計算機科學和實際工程中具有廣泛應用,以下是一些典型場景:

  1. 任務調度與資源管理
    • 操作系統進程調度:CPU按照隊列順序執行進程,確保公平性。
    • 打印機任務隊列:用戶提交的打印任務按順序處理,避免混亂。
  1. 消息傳遞與緩沖區管理
    • 網絡數據包處理:接收到的數據包按順序進入隊列,由處理器按順序處理,確保數據完整性。
    • 生產者-消費者模型:生產者將數據放入隊列,消費者從隊列中取出數據,實現解耦和異步處理。
  1. 算法與系統設計
    • 廣度優先搜索(BFS):使用隊列逐層遍歷圖的節點,確保按層次訪問。
    • Web服務器請求處理:客戶端請求按順序進入隊列,服務器按順序響應,避免過載。
  1. 異步通信與事件處理
    • 即時通訊應用:如WhatsApp在用戶離線時,消息暫存于隊列,待用戶上線后按順序接收。
    • GUI事件處理:用戶操作事件按順序進入隊列,由事件循環按順序處理。

六、優缺點

  • 優點
    • 邏輯簡單,易于實現。
    • 保證元素順序處理,適用于需要公平性的場景。
  • 缺點
    • 數組實現需預先分配空間,可能浪費或不足。
    • 中間插入或刪除效率低(需移動大量元素),但隊列通常不涉及此類操作。

七、參看資料

Java 中常用隊列用法詳解 - 技術棧

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

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

相關文章

Ubuntu 安裝 Miniconda 及配置國內鏡像源完整指南

目錄 Miniconda 安裝Conda 鏡像源配置Pip 鏡像源配置驗證配置基本使用常見問題 1. Miniconda 安裝 1.1 下載安裝腳本 wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh1.2 執行安裝 bash Miniconda3-latest-Linux-x86_64.sh按回車查看許可協議…

PYTHON通過VOSK實現離線聽寫支持WINDOWSLinux_X86架構

在當今人工智能快速發展的時代&#xff0c;語音識別技術已經成為人機交互的重要方式之一。本文將介紹如何使用Python結合Vosk和PyAudio庫實現一個離線語音識別系統&#xff0c;無需依賴網絡連接即可完成語音轉文字的功能。 技術棧概述 1. Vosk語音識別引擎 Vosk是一個開源的…

【Java進階】圖像處理:從基礎概念掌握實際操作

一、核心概念&#xff1a;BufferedImage - 圖像的畫布與數據載體 在Java圖像處理的世界里&#xff0c;BufferedImage是當之無愧的核心。你可以將它想象成一塊內存中的畫布&#xff0c;所有的像素數據、顏色模型以及圖像的寬度、高度等信息都存儲在其中。 BufferedImage繼承自…

數據治理系統是什么?數據治理工具有什么用?

目錄 一、數據治理系統是什么&#xff1f; 二、數據治理系統的重要性 1. 保障數據質量 2. 確保數據安全 3. 促進數據共享與協作 三、常見的數據治理工具及其特點 1. 數據質量管理工具 2. 數據集成工具 3. 元數據管理工具 四、數據治理工具有哪些作用&#xff1f; 1.…

消息隊列-kafka為例

目錄 消息隊列應用場景和基礎知識MQ常見的應用場景MQ消息隊列的兩種消息模式如何保證消息隊列的高可用&#xff1f;如何保證消息不丟失&#xff1f;如何保證消息不被重復消費&#xff1f;如何保證消息消費的冪等性&#xff1f;重復消費的原因解決方案 如何保證消息被消費的順序…

C++17常量

nullptr nullptr出現的目的是為了替代NULL。在某種意義上來說&#xff0c;傳統會把NULL,0視為同一種東 西&#xff0c;這取決于編譯器如何定義NULL&#xff0c;有些編譯器會將定義為((void*)0)&#xff0c;有些則會直接將其定義 為0。 C不允許直接將void*隱式轉換到其他類型。…

計算機網絡學習(九)——CDN

一、CDN CDN&#xff08;Content Delivery Network&#xff0c;內容分發網絡&#xff09;是一種通過分布式節點將內容更高效地傳遞給用戶的技術架構&#xff0c;廣泛應用于加速網站、視頻、下載、直播等業務。 CDN 是把內容放到離用戶最近的“高速公路入口”&#xff0c;提升訪…

Elasticsearch的寫入流程介紹

Elasticsearch 的寫入流程是一個涉及 分布式協調、分片路由、數據同步和副本更新 的復雜過程,其設計目標是確保數據一致性、可靠性和高性能。以下是寫入流程的詳細解析: 一、寫入流程總覽 二、詳細步驟解析 1. 客戶端請求路由 請求入口:客戶端(如 Java 客戶端、REST API)…

vue為什么點擊兩遍才把參數傳遞過去

先說一下場景&#xff0c;就是我把云服務器這個下拉選擇框分別初始化之后&#xff0c;然后點擊新建權限然后就打開了右側的抽屜式的對話框&#xff0c;頁面上那個文字信息是傳遞過來了。那個是正確的&#xff0c;但是我請求接口的時候&#xff0c;發現請求的接口的參數總是要慢…

java代碼性能優化

刷題過程中遇到的一些時間復雜度相同&#xff0c;但是常數因子的差距導致的性能差距&#xff0c;遇到持續更新 枚舉 VS contains 例如&#xff1a;判斷一個字符是不是元音 法一&#xff1a; if(ch a || ch e || ch i || ch o || ch u) 法二&#xff1a; Set<Charact…

OpenGL Chan視頻學習-9 Index Buffers inOpenGL

bilibili視頻鏈接&#xff1a; 【最好的OpenGL教程之一】https://www.bilibili.com/video/BV1MJ411u7Bc?p5&vd_source44b77bde056381262ee55e448b9b1973 函數網站&#xff1a; docs.gl 說明&#xff1a; 1.之后就不再單獨整理網站具體函數了&#xff0c;網站直接翻譯會…

基于微服務架構的社交學習平臺WEB系統的設計與實現

設計&#xff08;論文&#xff09;題目 基于微服務架構的社交學習平臺WEB系統的設計與實現 摘 要 社交學習平臺 web 系統要為學習者打造一個開放、互動且社交性強的在線教育環境&#xff0c;打算采用微服務架構來設計并實現一個社交學習平臺 web 系統&#xff0c;以此適應學…

生成式人工智能:重構軟件開發的范式革命與未來生態

引言 生成式人工智能&#xff08;GenAI&#xff09;正以顛覆性力量重塑軟件開發的底層邏輯。從代碼生成到業務邏輯設計&#xff0c;從數據分析到用戶交互&#xff0c;GenAI通過其強大的推理能力與場景適應性&#xff0c;將傳統開發流程的“復雜工程”轉化為“敏捷實驗”&#…

C++17原生測試編程實踐:現代特性與分支覆蓋指南

C17原生測試編程實踐&#xff1a;現代特性與分支覆蓋指南 概述 本文將深入探討如何利用C17新特性進行原生測試代碼編寫&#xff0c;實現完全分支覆蓋。我們將不依賴任何外部測試框架&#xff0c;而是使用C17標準庫構建完整的測試解決方案。 一、C17測試核心工具集 1. 斷言工…

RK3568項目(四)--uboot啟動流程之啟動模式選擇

目錄 一、引言 二、芯片初始化 ------>2.1、io_domain ------>2.2、調頻調壓 ------>2.3、控制臺初始化 三、平臺初始化 ------>3.1、設置mac地址 ------------>3.1.1、vendor分區 ------>3.2、設置serialno ------>3.3、設置下載模式 -------…

Kotlin JVM 注解詳解

前言 Kotlin 作為一門現代 JVM 語言&#xff0c;提供了出色的 Java 互操作性。為了更好地支持與 Java 代碼的交互&#xff0c;Kotlin 提供了一系列 JVM 相關注解。這些注解不僅能幫助我們控制 Kotlin 代碼編譯成 Java 字節碼的行為&#xff0c;還能讓我們的 Kotlin 代碼更好地…

Starrocks 物化視圖的實現以及在刷新期間能否讀數據

背景 本司在用Starrocks做一些業務上的分析的時候&#xff0c;用到了物化視圖&#xff0c;并且在高QPS的情況下&#xff0c;RT也沒有很大的波動&#xff0c;所以在此研究一下Starrock的實現&#xff0c;以及在刷新的時候是不是原子性的 本文基于Starrocks 3.3.5 結論 Starro…

[網頁五子棋][對戰模塊]前后端交互接口(建立連接、連接響應、落子請求/響應),客戶端開發(實現棋盤/棋子繪制)

文章目錄 約定前后端交互接口建立連接建立連接響應針對"落子"的請求和響應 客戶端開發實現棋盤/棋子繪制部分邏輯解釋 約定前后端交互接口 對戰模塊和匹配模塊使用的是兩套邏輯&#xff0c;使用不同的 websocket 的路徑進行處理&#xff0c;做到更好的耦合 建立連接 …

電工基礎【2】自鎖、互鎖、正反轉電路

04 自鎖、正反轉電路 我們講一下這個自鎖和正反轉。 自鎖電路圖示例圖 加了一個這個 KM1 自鎖。加了 KM1 的輔助觸頭&#xff0c;它怎么實現呢&#xff1f;它怎么就自鎖了呢&#xff1f;沒加它的時候為什么是點動&#xff1f;加它為什么自鎖&#xff1f; 講解一下。首先我們…

TypeScript 中感嘆號(!)兩種位置用法

這是一個非常好的問題&#xff01; 在 TypeScript 中&#xff0c;感嘆號&#xff08;!&#xff09;有兩種位置用法&#xff0c;它們含義完全不同&#xff1a; ? 一、后置感嘆號 !&#xff08;非空斷言&#xff09; process.env.ADMIN_PRIVATE_KEY! ? 作用&#xff1a; 告…