【數據結構】線性表----隊列詳解

1. 隊列的基本概念

話不多說,直接開始!

隊列是一種線性數據結構,同棧類似但又不同,遵循先進先出FIFO, First In First Out)的原則。換句話說,最先進入隊列的元素會最先被移除。這樣的特點使得隊列非常適合用于需要按順序處理任務的場景。
在這里插入圖片描述

特點:

  • 先進先出:第一個進入隊列的元素最先被處理。
  • 操作受限:元素只能從隊尾插入,從隊頭移除。
2. 隊列的實現

在這里插入圖片描述

隊列可以通過多種方式實現,常見的有數組和鏈表兩種。

使用數組實現隊列:
使用數組實現隊列需要維護兩個指針,分別指向隊頭和隊尾,并且需要處理數組的溢出問題。所以數組不是很適合用來實現隊列。

使用鏈表實現隊列:
鏈表不會受到同數組一樣的困擾,并且鏈表實現的隊列沒有數組的大小限制;但需要額外的指針來管理鏈表的節點。

4. 隊列的基本操作

隊列的基本操作包括入隊(Enqueue)出隊(Dequeue)查看隊頭(Peek)檢查隊列是否為空(IsEmpty)

入隊(Enqueue):
將元素添加到隊尾。

出隊(Dequeue):
移除隊頭的元素。

查看隊頭(Peek):
查看隊頭的元素,但不移除。

檢查隊列是否為空(IsEmpty):
檢查隊列中是否有元素。

5. 隊列的高級用法

循環隊列:
循環隊列是一種優化的隊列實現,避免了數組實現中由于出隊操作造成的空間浪費。

優先隊列:
優先隊列中的元素具有優先級,出隊時優先級高的元素會被優先移除。

6.兩種形式的隊列實現

在這里插入圖片描述

入隊(Enqueue)

將元素添加到隊尾。如果使用數組實現,需要檢查隊列是否已滿。如果使用鏈表實現,只需將新節點添加到鏈表的末尾。

數組實現的入隊操作:

void enqueue(Queue* q, int value) {if (isFull(q)) {printf("Queue is full!\n");return;}if (isEmpty(q)) {q->front = 0;}q->rear++;q->items[q->rear] = value;
}

鏈表實現的入隊操作:

void enqueue(Queue* q, int value) {Node* newNode = (Node*)malloc(sizeof(Node));newNode->data = value;newNode->next = NULL;if (isEmpty(q)) {q->front = newNode;} else {q->rear->next = newNode;}q->rear = newNode;
}
出隊(Dequeue)

移除隊頭的元素。如果使用數組實現,需要檢查隊列是否為空,并調整隊頭指針。如果使用鏈表實現,需要移除鏈表的第一個節點。

數組實現的出隊操作:

int dequeue(Queue* q) {if (isEmpty(q)) {printf("Queue is empty!\n");return -1;}int item = q->items[q->front];q->front++;if (q->front > q->rear) {initQueue(q);}return item;
}

鏈表實現的出隊操作:

int dequeue(Queue* q) {if (isEmpty(q)) {printf("Queue is empty!\n");return -1;}int item = q->front->data;Node* temp = q->front;q->front = q->front->next;if (q->front == NULL) {q->rear = NULL;}free(temp);return item;
}
查看隊頭(Peek)

查看隊頭的元素,但不移除。如果隊列為空,應返回特定的錯誤值或拋出異常。

數組實現的查看隊頭操作:

int peek(Queue* q) {if (isEmpty(q)) {printf("Queue is empty!\n");return -1;}return q->items[q->front];
}

鏈表實現的查看隊頭操作:

int peek(Queue* q) {if (isEmpty(q)) {printf("Queue is empty!\n");return -1;}return q->front->data;
}
檢查隊列是否為空(IsEmpty)

檢查隊列中是否有元素。這是一個常用的輔助操作,用于確保其他操作的前提條件。

數組實現的檢查是否為空操作:

int isEmpty(Queue* q) {return q->front == -1;
}

鏈表實現的檢查是否為空操作:

int isEmpty(Queue* q) {return q->front == NULL;
}

隊列的高級玩法

除了基本操作外,隊列還有一些高級用法,如循環隊列和優先隊列。

循環隊列

在這里插入圖片描述

循環隊列是一種優化的隊列實現,避免了數組實現中由于出隊操作造成的空間浪費。循環隊列通過將隊尾連接到隊頭,使得數組能夠循環使用。

循環隊列的實現:

#define MAX 100typedef struct {int items[MAX];int front, rear;
} CircularQueue;void initQueue(CircularQueue* q) {q->front = -1;q->rear = -1;
}int isEmpty(CircularQueue* q) {return q->front == -1;
}int isFull(CircularQueue* q) {return (q->rear + 1) % MAX == q->front;
}void enqueue(CircularQueue* q, int value) {if (isFull(q)) {printf("Queue is full!\n");return;}if (isEmpty(q)) {q->front = 0;}q->rear = (q->rear + 1) % MAX;q->items[q->rear] = value;
}int dequeue(CircularQueue* q) {if (isEmpty(q)) {printf("Queue is empty!\n");return -1;}int item = q->items[q->front];if (q->front == q->rear) {initQueue(q);} else {q->front = (q->front + 1) % MAX;}return item;
}
優先隊列

優先隊列中的元素具有優先級,出隊時優先級高的元素會被優先移除。優先隊列可以使用**堆(Heap)**來實現,能夠高效地進行插入和刪除操作。
而堆我們將會在下一章進行講解。

隊列在實際中的應用

隊列在許多實際應用中扮演重要角色,以下是幾個常見的例子:

操作系統中的任務調度

操作系統使用隊列管理任務的執行順序。任務調度器將所有待處理的任務放入隊列中,并按順序調度這些任務。

打印隊列

打印機使用隊列管理打印任務,確保按順序打印。

廣度優先搜索(BFS)

在圖的遍歷中,BFS使用隊列管理待訪問的節點。BFS是一種圖的遍歷算法,它從根節點開始,先訪問所有相鄰節點,再按層次訪問更深的節點。

使用隊列時需要注意的問題

  1. 空間復雜度: 數組實現的隊列在入隊和出隊操作后可能會導致空間浪費,使用循環隊列可以解決這個問題。
  2. 時間復雜度: 隊列的基本操作時間復雜度通常為O(1),但優先隊列的插入和刪除操作可能會更耗時,具體取決于實現方式。
  3. 內存管理: 使用鏈表實現隊列時,需要注意內存管理,確保在出隊操作后釋放已移除節點的內存,避免內存泄漏。

總結

隊列作為一種重要的數據結構,具有簡單但實用的特性。在本文中,我們介紹了隊列的基本概念、實現方法、常見操作、實際應用以及使用時需要注意的問題。通過實踐代碼示例,相信讀者能更好地理解和掌握隊列的使用。隊列在編程中的應用廣泛,相信掌握了它將為你的編程技能打下堅實的基礎。

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

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

相關文章

小白學python(第七天)

哈哈,這個系列的文章也有一段時間沒更新,主要是最近在忙c嘎嘎,不過沒事接下來會優先更python啦,那么我們先進入正題吧 函數的定義及調用 函數定義 格式:def 函數名(形參列表): 語…

QTabWidget、QListWidget、QStackedWidget

The QTabWidget class provides a stack of tabbed widgets. More... The QListWidget class provides an item-based list widget. More... QStringList strlist;strlist<<"系統"<<"外觀"<<"截圖"<<"貼圖"…

.NET MAUI開源架構_4..NET MAUI 應用支持的平臺

可以針對以下平臺編寫 .NET Multi-platform App UI (.NET MAUI) 應用&#xff1a; 需要 Android 5.0 (API 21) 或更高版本。需要 iOS 11 或更高版本使用 Mac Catalyst 的 macOS 11 或更高版本。Windows 11 和 Windows 10 版本 1809 或更高版本&#xff0c;使用 Windows UI 庫 …

Java的高級特性

類的繼承 繼承是從已有的類中派生出新的類&#xff0c;新的類能擁有已有類的屬性和行為&#xff0c;并且可以拓展新的屬性和行為 public class 子類 extends 父類{子類類體 } 優點 代碼的復用 提高編碼效率 易于維護 使類與類產生關聯&#xff0c;是多態的前提 缺點 類缺乏獨…

c/c++ 打印調用棧

打印調用棧可以在程序出現死機的時候&#xff08;如出現 SIGABRT、SIGSEGV等一些信號錯誤&#xff09;是很有用的信息&#xff0c;有可能就不需要 core file 來協助排查問題了。通過 man backtrace 可以得到一個例子的源碼&#xff1a; #define SIZE 100 static void backTrac…

【機器學習-00】機器學習是什么?

在科技飛速發展的今天&#xff0c;機器學習已成為一個熱門話題&#xff0c;廣泛應用于各個行業和領域。那么&#xff0c;機器學習到底是什么&#xff1f;它又是如何工作的&#xff1f;本文將深入探討機器學習的定義、原理及其在各領域的應用&#xff0c;帶領讀者走進這個神秘而…

RedisTemplate 中序列化方式辨析

在Spring Data Redis中&#xff0c;RedisTemplate 是操作Redis的核心類&#xff0c;它提供了豐富的API來與Redis進行交互。由于Redis是一個鍵值存儲系統&#xff0c;它存儲的是字節序列&#xff0c;因此在使用RedisTemplate時&#xff0c;需要指定鍵&#xff08;Key&#xff09…

力扣題解( 等差數列劃分 II - 子序列)

446. 等差數列劃分 II - 子序列 給你一個整數數組 nums &#xff0c;返回 nums 中所有 等差子序列 的數目。 如果一個序列中 至少有三個元素 &#xff0c;并且任意兩個相鄰元素之差相同&#xff0c;則稱該序列為等差序列。 例如&#xff0c;[1, 3, 5, 7, 9]、[7, 7, 7, 7] 和…

Netgear WN604 downloadFile.php 信息泄露漏洞復現(CVE-2024-6646)

0x01 產品簡介 NETGEAR WN604是一款由NETGEAR(網件)公司生產的無線接入器(或無線路由器)提供Wi-Fi保護協議(WPA2-PSK, WPA-PSK),以及有線等效加密(WEP)64位、128位和152位支持,保障網絡安全。同時支持MAC地址認證、802.1x RADIUS以及EAP TLS、TTLS、PEAP等安全機制,…

Flat Ads:金融APP海外廣告投放素材的優化指南

在當今全球化的數字營銷環境中,金融APP的海外營銷推廣已成為眾多金融機構與開發者最為關注的環節之一。面對不同地域、文化及用戶習慣的挑戰,如何優化廣告素材,以吸引目標受眾的注意并促成有效轉化,成為了廣告主們亟待解決的問題。 作為領先的全球化營銷推廣平臺,Flat Ads憑借…

超簡易高效的 AI繪圖工具—與sd-webui一致界面,6G顯存最高提升75%出圖速率!(附安裝包)

大家好&#xff0c;我是靈魂畫師向陽 今天給大家分享一個基于Stable Diffusion WebUI 構建的AI繪圖工具—sd-webui-forge&#xff0c;該工具的目標在于簡化插件開發&#xff0c;優化資源管理&#xff0c;加速推理。 Forge承諾永遠不會對Stable Diffusion WebUI用戶界面添加不…

獲獎案例回顧|基于衛星遙感和無人機的水稻全流程風險減量項目

引言 在現代農業保險領域&#xff0c;技術創新是推動行業進步的關鍵。珈和科技與太平財險的合作&#xff0c;旨在利用先進的衛星遙感和無人機技術&#xff0c;解決傳統農業保險面臨的諸多挑戰&#xff0c;從而提升保險效率和服務質量。本次分享的項目案例獲得了《金融電子化》…

啟動yarn后,其他節點沒有NodeManager

寫在前面&#xff1a; 這個問題雖然折磨了我兩天&#xff0c;但是原因特別蠢&#xff0c;可能與各位不一定一樣&#xff0c;我是因為ResourceManager的節點的"/etc/hadoop/workers"文件沒有配置好&#xff08;沒有配hadoop102和hadoop104&#xff09;&#xff0c;但排…

數字圖像處理(實踐篇)四十八 PCA主成分分析降維與圖像重建

目錄 一 PCA 二 實踐 實踐① 實踐② 一 PCA 主成分分析(PCA)是一種常見的數據分析技術,它可以用于降維和特征提取。 PCA 的作用包括以下幾個方面: ①數據降維:PCA 可以將高維數據降維到低維空間中,從而方便后續的數據分析和可視化。可以將具有多個變量的數據集降維…

P1850換教室 題解(概率dp)

題目&#xff1a;https://www.luogu.com.cn/problem/P1850 思路&#xff1a; 概率dp,如果要求最小路徑期望&#xff0c;我們要確定的有選了幾節課&#xff0c;申請換了幾節課&#xff0c;最后一節是否申請換課&#xff08;下一次選課要知道上一次選課申請情況&#xff09;。 …

小白學webgl合集-三維數據源和格式

大多數地圖瓦片數據是二維的&#xff0c;三維效果通過渲染和樣式設置實現。主要的三維數據源和格式包括&#xff1a; 1. 3D Tiles (CesiumJS) 3D Tiles 是一種開放標準&#xff0c;用于流式傳輸和可視化大規模三維地理數據。它可以包含各種三維數據&#xff0c;如建筑物、點云…

循環結構(二)——while語句【互三互三】

文章目錄 &#x1f341;引言 &#x1f341;一、語句格式 &#x1f341;二、語句執行過程 &#x1f341;三、格式舉例 &#x1f341;四、例題 &#x1f449;【例1】 &#x1f48e;【示例代碼】 &#x1f449;【例2】 &#x1f680;【方法1】&#xff1a; &#x1f48e…

運維的操作紅線

1. 無工單、郵件的任何操作&#xff0c;嚴禁執行。 2. 工單標題和內容不一致或工單內容超出現場范圍禁止操作。 3. 操作前必須確定資產信息&#xff1a;機柜號、U位、資產號、sn 號、ip。 4. 機柜后門操作設備&#xff0c;必須多次執行第 3 條紅線。 5. 嚴禁操作、觸碰工單指定…

【Java伴學筆記】Day-02 變量|計算機的存儲方式|數據類型|標識符|鍵盤輸入流

一、變量 在Java中&#xff0c;變量用于存儲數據值&#xff0c;可以是數字、文本或其他類型的信息。Java中的變量必須聲明后才能使用&#xff0c;并且每個變量都有特定的類型。下面是一些基本的變量使用示例&#xff1a; 聲明一個整型變量并賦值&#xff1a; int myNumber; …

企業如何選擇渲染農場?渲染100邀請碼1a12

渲染農場能降低企業成本&#xff0c;幫助企業更好的服務客戶&#xff0c;那么如何選擇渲染農場呢&#xff1f;又有什么標準&#xff1f;這次我們就來看下。 1、渲染性能 渲染性能是衡量農場優劣的重要指標&#xff0c;性能越好農場越優質&#xff0c;性能主要包括渲染速度、穩…