數據結構與算法學習筆記九---循環隊列的表示和實現(C++)

目錄

前言

1.為什么要使用循環隊列

2.隊列的順序存儲方式的實現

1.定義

2.隊列初始化

3.銷毀

4.清空隊列

5.隊列是否為空

6.隊列長度

7.隊頭

8.入隊

9.出隊

10.遍歷隊列

11.完整代碼

3.參考資料


前言

? ? 這篇文章介紹循環隊列的表示和用法

1.為什么要使用循環隊列

? ? ? ? 在上一篇文章中,我們知道了順序的循環表示和實現方法。但是我們會發現當我們在操作順序鏈表的時候,我們頻繁的操作順序隊列,而隊列又不為空的時候,出隊列的一些存儲空間會變得不可用。

? ? ? ? 如下圖所示,當我rear=3,front=2的時候,順序隊列中至少有連個存儲空間空間是不可以使用的,這無疑會浪費一些存儲空間。那么有沒有辦法讓我們在出隊列之后,重復利用之前存儲空間呢,答案是有的。

? ? ? ? 圖1.順序隊列的出隊列和入隊列操作示意圖

? ? ? ? 這里借鑒了網上老師的三種解決方案:

????????1.使用計數器記錄隊列中的元素個數

????????2.加標志位,刪除的時候標志位置1,插入置0,當front = rear并且標志位為0,表示隊列為空,當front=rear并且標志位為1的時候,表示隊列經滿。

? ? ? ? 3.認為浪費一個存儲空間,改成一個循環隊列來實現。

? ? ? ? 這里下面代碼的表示和實現采用的第三種方案。

? ? ? ? 關于循環隊列的理解,感覺嚴蔚敏老師的講解還是不錯的,直接貼個圖吧。

圖2.嚴蔚敏老師數據結構與算法中關于循環隊列的思路

2.隊列的順序存儲方式的實現

1.定義

struct CircularQueue {int *base;int front;int rear;int maxSize; // 隊列的最大容量
};

2.隊列初始化

// 隊列初始化
Status initQueue(CircularQueue &circularQueue, int maxSize) {circularQueue.base = new int[maxSize]; // 為循環隊列分配內存if (!circularQueue.base) {return 0; // 內存分配失敗}circularQueue.front = circularQueue.rear = 0; // 初始化隊首和隊尾指針circularQueue.maxSize = maxSize;return 1; // 初始化成功
}

3.銷毀

// 銷毀隊列
void destroyQueue(CircularQueue &circularQueue) {if (circularQueue.base) {delete[] circularQueue.base; // 釋放內存circularQueue.base = nullptr; // 將指針置為空}
}

4.清空隊列

// 清空隊列
void clearQueue(CircularQueue &circularQueue) {circularQueue.front = circularQueue.rear = 0; // 重置隊首和隊尾指針
}

5.隊列是否為空

// 判斷隊列是否為空
bool isEmptyQueue(CircularQueue &circularQueue) {return circularQueue.front == circularQueue.rear; // 當隊首和隊尾指針相同時,隊列為空
}

6.隊列長度

// 獲取隊列長度
int queueLength(CircularQueue &circularQueue) {return (circularQueue.rear - circularQueue.front + circularQueue.maxSize) % circularQueue.maxSize;
}

7.隊頭

// 獲取隊首元素
Status getQueueFront(CircularQueue &circularQueue, int &frontElement) {if (isEmptyQueue(circularQueue)) {return 0; // 隊列為空}frontElement = circularQueue.base[circularQueue.front];return 1; // 成功獲取隊首元素
}

8.入隊

// 入隊
bool enQueue(CircularQueue &circularQueue, int element) {// 檢查隊列是否已滿if ((circularQueue.rear + 1) % circularQueue.maxSize == circularQueue.front) {return false; // 隊列已滿}// 入隊操作circularQueue.base[circularQueue.rear] = element;circularQueue.rear = (circularQueue.rear + 1) % circularQueue.maxSize; // 移動隊尾指針return true; // 入隊成功
}

9.出隊

// 出隊
bool deQueue(CircularQueue &circularQueue, int &element) {// 檢查隊列是否為空if (isEmptyQueue(circularQueue)) {return false; // 隊列為空,無法出隊}// 出隊操作element = circularQueue.base[circularQueue.front];circularQueue.front = (circularQueue.front + 1) % circularQueue.maxSize; // 移動隊首指針return true; // 出隊成功
}

10.遍歷隊列

// 遍歷隊列
void traverseQueue(CircularQueue &circularQueue) {// 遍歷隊列并打印元素int i = circularQueue.front;while (i != circularQueue.rear) {cout << circularQueue.base[i] << " ";i = (i + 1) % circularQueue.maxSize;}cout << endl;
}

11.完整代碼

#include <iostream>
using namespace std;typedef int Status;struct CircularQueue {int *base;int front;int rear;int maxSize; // 隊列的最大容量
};// 隊列初始化
Status initQueue(CircularQueue &circularQueue, int maxSize) {circularQueue.base = new int[maxSize]; // 為循環隊列分配內存if (!circularQueue.base) {return 0; // 內存分配失敗}circularQueue.front = circularQueue.rear = 0; // 初始化隊首和隊尾指針circularQueue.maxSize = maxSize;return 1; // 初始化成功
}// 銷毀隊列
void destroyQueue(CircularQueue &circularQueue) {if (circularQueue.base) {delete[] circularQueue.base; // 釋放內存circularQueue.base = nullptr; // 將指針置為空}
}// 清空隊列
void clearQueue(CircularQueue &circularQueue) {circularQueue.front = circularQueue.rear = 0; // 重置隊首和隊尾指針
}// 判斷隊列是否為空
bool isEmptyQueue(CircularQueue &circularQueue) {return circularQueue.front == circularQueue.rear; // 當隊首和隊尾指針相同時,隊列為空
}// 獲取隊列長度
int queueLength(CircularQueue &circularQueue) {return (circularQueue.rear - circularQueue.front + circularQueue.maxSize) % circularQueue.maxSize;
}// 獲取隊首元素
Status getQueueFront(CircularQueue &circularQueue, int &frontElement) {if (isEmptyQueue(circularQueue)) {return 0; // 隊列為空}frontElement = circularQueue.base[circularQueue.front];return 1; // 成功獲取隊首元素
}// 入隊
bool enQueue(CircularQueue &circularQueue, int element) {// 檢查隊列是否已滿if ((circularQueue.rear + 1) % circularQueue.maxSize == circularQueue.front) {return false; // 隊列已滿}// 入隊操作circularQueue.base[circularQueue.rear] = element;circularQueue.rear = (circularQueue.rear + 1) % circularQueue.maxSize; // 移動隊尾指針return true; // 入隊成功
}// 出隊
bool deQueue(CircularQueue &circularQueue, int &element) {// 檢查隊列是否為空if (isEmptyQueue(circularQueue)) {return false; // 隊列為空,無法出隊}// 出隊操作element = circularQueue.base[circularQueue.front];circularQueue.front = (circularQueue.front + 1) % circularQueue.maxSize; // 移動隊首指針return true; // 出隊成功
}// 遍歷隊列
void traverseQueue(CircularQueue &circularQueue) {// 遍歷隊列并打印元素int i = circularQueue.front;while (i != circularQueue.rear) {cout << circularQueue.base[i] << " ";i = (i + 1) % circularQueue.maxSize;}cout << endl;
}int main() {CircularQueue circularQueue;int maxSize = 10; // 隊列的最大容量initQueue(circularQueue, maxSize); // 初始化循環隊列// 測試入隊for (int i = 1; i <= 5; ++i) {enQueue(circularQueue, i * 10);}// 輸出隊列元素cout << "隊列元素:";traverseQueue(circularQueue);// 獲取隊首元素int frontElement;if (getQueueFront(circularQueue, frontElement)) {cout << "隊首元素:" << frontElement << endl;}// 測試出隊int element;for (int i = 0; i < 3; ++i) {if (deQueue(circularQueue, element)) {cout << "出隊元素:" << element << endl;}}// 輸出隊列元素cout << "隊列元素:";traverseQueue(circularQueue);// 判斷隊列是否為空if (isEmptyQueue(circularQueue)) {cout << "隊列為空" << endl;} else {cout << "隊列不為空" << endl;}// 獲取隊列長度cout << "隊列長度:" << queueLength(circularQueue) << endl;// 清空隊列clearQueue(circularQueue);// 判斷清空后隊列是否為空if (isEmptyQueue(circularQueue)) {cout << "清空隊列后,隊列為空" << endl;} else {cout << "清空隊列后,隊列不為空" << endl;}// 銷毀隊列destroyQueue(circularQueue);return 0;
}

3.參考資料

1.B站上看到的一個老師的講解

2.數據結構C語言版(1997年清華大學出版社出版的圖書)_百度百科

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

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

相關文章

詳細分析Vue3中的defineExpose(附Demo)

目錄 前言1. 基本知識2. Demo3. 實戰 前言 其基本知識可參考官網&#xff1a;Vue3中的defineExpose 1. 基本知識 defineExpose 是 Vue 3 的 Composition API 中一個新的實用函數&#xff0c;用于在 <script setup> 語法下顯式暴露組件的公共屬性和方法 這在處理子組件…

OpenAI 重磅發布:ChatGPT Mac 桌面應用震撼上線!

OpenAI 重磅發布&#xff1a;ChatGPT Mac 桌面應用震撼上線&#xff01; 博主貓頭虎的技術世界 &#x1f31f; 歡迎來到貓頭虎的博客 — 探索技術的無限可能&#xff01; 專欄鏈接&#xff1a; &#x1f517; 精選專欄&#xff1a; 《面試題大全》 — 面試準備的寶典&#xff0…

51單片機:點亮一個LED燈

1.新建工程 選擇AT89C52&#xff0c;在Atmel下顯示的是See Microchip 并不需要添加啟動文件到文件夾中。 添加main.c文件&#xff0c;c比cpp效率高&#xff0c;.asm匯編即更底層 程序編寫好后 nop(); 該函數在這個頭文件里面 #include <INTRINS.H> #include <R…

Java JDK下載安裝教程(2024年)

博主介紹&#xff1a;?Java老徐、7年大廠程序員經歷。全網粉絲12w、csdn博客專家、掘金/華為云/阿里云/InfoQ等平臺優質作者、專注于Java技術領域和畢業項目實戰? &#x1f345;文末獲取源碼聯系&#x1f345; &#x1f447;&#x1f3fb; 精彩專欄推薦訂閱&#x1f447;&…

2024 Google I/O Android 相關內容匯總

2024 Google I/O Android 相關內容匯總 本次 Google I/O 的核心雖然是 AI &#xff0c;但是 Android 也是作為主要議題出現&#xff0c; Android 部分可以簡單分為產品和開發相關內容&#xff0c;接下來主要介紹這兩部分的相關更新。 重點開始開發相關&#xff0c;內容不少 產…

業務系統加固和安全設備加固

業務系統加固 業務系統包含哪些系統? 業務系統漏洞面臨的風險 1web風險 2漏洞掃描&#xff0c;端口掃描 3系統漏洞 4邏輯漏洞 5 信息泄露 6拒絕服務 7口令爆破 加固方式&#xff1a; 在風險加上修復 1web漏洞&#xff1a; 包括csrf,xss&#xff0c;口令破解等等 修…

koa2 + jsonwebtoken + koa-jwt:實現node token驗證

一、koa token生成、驗證 koa-jwt官網 https://github.com/koajs/jwt 推薦一個koa-jwt學習文檔&#xff1a; https://www.ruanyifeng.com/blog/2018/07/json_web_token-tutorial.html jsonwebtoken方法添加 const { sign, verify } require(jsonwebtoken); const secretKey …

ICode國際青少年編程競賽- Python-4級訓練場-列表綜合練習

ICode國際青少年編程競賽- Python-4級訓練場-列表綜合練習 1、 Flyer[3].step(1) Flyer[7].step(2) Flyer[11].step(1) for i in range(4):Flyer[i * 2].step(1) Flyer[8].step(3)for i in range(3):Dev.turnRight()Dev.step(-5)2、 for i in range(5):Flyer[i5].step(Flyer[…

JavaWeb--18 tlias-web-management 登錄認證

登錄認證 1 登錄功能功能開發 2 登錄校驗2.1 問題分析2.2 會話技術CookieSession令牌技術 2.3 JWT令牌介紹生成和校驗登錄下發令牌 2.4 過濾器Filter攔截路徑過濾器鏈 登錄校驗-Filter 2.5 攔截器InterceptorInterceptor詳解執行流程 登錄校驗- Interceptor 3 異常處理3.1 當前…

【會議征稿】2024年機器人前沿技術與創新國際會議(FTIR 2024, 7/19-21)

2024年機器人前沿技術與創新國際會議&#xff08;FTIR 2024&#xff09;將于2024年7月19-21日在中國杭州舉行。FTIR 2024聚焦前沿技術與創新&#xff0c;將把機器人領域的創新學者和專家聚集到一個共同的論壇。會議的主要目標是促進機器人的研究和開發活動&#xff0c;另一個目…

基于EBAZ4205礦板的圖像處理:11閾值系數可調的圖像局部閾值二值化

基于EBAZ4205礦板的圖像處理&#xff1a;11閾值系數可調的圖像局部閾值二值化 先看效果 還是一樣拿我的pynq當模特&#xff0c;然后用usb——HDMI采集卡把輸出圖像采集到電腦上。 注意看右邊mobelxtem中的通過串口調節的參數&#xff0c; 我這里是實現了閾值系數可調的局部閾…

利用CAD繪制角度斜線的簡易指南---模大獅模型網

在CAD設計中&#xff0c;繪制角度斜線是常見的需求&#xff0c;尤其在工程、建筑等領域中。正確繪制角度斜線不僅可以提高圖紙的清晰度和美觀度&#xff0c;還有助于準確表達設計意圖。本文將介紹如何利用CAD軟件進行角度斜線的繪制&#xff0c;為您提供簡明易懂的操作指南。 一…

安全設備篇——抗DDOS設備

寫在前面&#xff1a;up初研究這個設備的時候以為很容易&#xff0c;畢竟ddos嘛大家都懂&#xff0c;但是實際去找資料和研究的時候發現資料少的可憐&#xff0c;再加上大家知道ddos但大多沒見過&#xff0c;萬幸up的老東家某普有這類設備&#xff0c;和之前的同事溝通了一下還…

實戰期權:權利金=定金;無需等到期日

買方: 無需支付保證金,只需支付較低的權利金(定金)。 風險: 虧損有上限,即權利金損失;但盈利無限,以小博大。 使用場景: 大型單邊行情。 行情的絕對頂部 or 底部,最好是第二次頂或者第二次抵,風險較小。 買方舉例: 假如判斷當前在底部,買入看漲期權call…

網絡完全精通版

一、目錄結構 1.1目的的特點 windows和linux windows中C、D、E盤&#xff0c;每個都是一個根系統【多跟系統】 linux中只有一個根【單根系統】 1.2各個目錄存儲的內容 /root&#xff1a;linux中掛管理員用戶的家目錄 /home&#xff1a;linux中掛存儲普通用戶的家目錄的目…

GitLab CI/CD的原理及應用詳解(三)

本系列文章簡介: 在當今快速變化的軟件開發環境中,持續集成(Continuous Integration, CI)和持續交付(Continuous Delivery, CD)已經成為提高軟件開發效率、確保代碼質量以及快速響應市場需求的重要手段。GitLab CI/CD,作為GitLab平臺提供的一套強大的自動化工具集,為開…

Unity射擊游戲開發教程:(17)添加推進器推進和推進器推進動畫

添加推進器打開功能 我們可以添加一個推進器欄,用于跟蹤玩家使用推進器增強(按住左 Shift 鍵)的時間。當未使用推力時,將會有一段延遲,直到推力條開始再生。當棒再生時,可以使用推進器,但再生過程將重新開始。 我們將使用 Unity 的 UI Slider 組件,因此我們將其添加到已…

編程算法中,有許多經典的問題和挑戰

在編程算法中&#xff0c;有許多經典的問題和挑戰&#xff0c;下面是一些常見的問題名字及其簡要描述&#xff1a; 迷宮問題 (Maze Problem)&#xff1a;給定一個迷宮布局&#xff0c;找到從起點到終點的路徑。 八皇后問題 (N-Queens Problem, 通常特指8皇后)&#xff1a;在NN…

Docker容器啟動時報OCI runtime create failed解決方案

解決方案&#xff1a;此問題是因為selinux未關閉所致&#xff0c;解決方案是修改/etc/selinux/config文件&#xff0c;將SELINUX設為disabled&#xff0c;重啟服務器即可。