[C/C++]數據結構 循環隊列

前言:

? ? ? ? 隊列是一種具有先進先出特性的結構,但是當數據出隊列以后,前面的空間就無法再次利用了,循環隊列就可以解決這個問題

一:概念及結構:

1.循環隊列概念

????????循環隊列是一種線性數據結構,其操作表現基于 FIFO(先進先出)原則并且隊尾被連接在隊首之后以形成一個循環.

2.循環隊列結構

? ? ? ? 循環隊列可以使用數組實現也可以使用鏈表實現,但是還是建議使用數組實現.另外在給數組開辟空間時,要比隊列實際長度多一個,如果開辟空間和隊列存儲數據的長度一樣的話,在判斷隊列為空和隊列為滿時,兩者都為 front==rear 會出現一樣的情況導致無法判斷,如

所以必須多開辟一個空間,這個空間不存儲數據,這樣就可以區分出兩種情況

結構定義:

? ? ? ? front用于維護隊頭,指向隊頭元素位置,back用于維護隊尾,總是指向隊尾元素的下一個位置,k表示隊列實際存數據的長度

ps:循環隊列的長度是固定的

typedef struct {int *a;int front; int back;int k;  //隊列大小
} MyCircularQueue;

二:功能實現

1.入隊:

????首先要判斷隊列是否已滿,再進行入隊的操作,入隊操作需要考慮索引循環的問題,當索引越界,需要讓它變成最小值

? ? ? ? 如果入隊是這種情況,直接在隊尾處插入數據,back++即可

? ? ? ? 但是如果碰到這種情況,back就不能簡單加一就完事了了,還需要將back重新指向數組剛開始的空間,不然就體現不出循環的特點了

?????????所以在隊尾插入數據back++后,進行?back=(back)%(k+1)?就可以使back重新指向數組起始位置(這里要注意的是,我定義的k是隊列不帶多開辟的那一個空間的長度)

bool myCircularQueueEnQueue(MyCircularQueue* obj, int value) {if(myCircularQueueIsFull(obj))//入隊前先判斷是否還有空間return false;obj->a[obj->back]=value;obj->back++;obj->back%=(obj->k+1);return true;
}

2.出隊:

? ? ? ?首先判斷隊列是否為空,在進行出隊操作,出隊也需要考慮front的索引問題

bool myCircularQueueDeQueue(MyCircularQueue* obj) {if(myCircularQueueIsEmpty(obj))return false;obj->front++;obj->front%=(obj->k+1);return true;
}

3.取隊頭元素

????????front指向的就是隊頭元素

int myCircularQueueFront(MyCircularQueue* obj) {if(myCircularQueueIsEmpty(obj))return -1;return obj->a[obj->front];
}

4.取隊尾元素

? ? ? ? ? 由于back始終指向隊尾的下一個元素,在一般情況下直接返回back-1所指向的元素即可,但是有一種特殊情況,如果此時back指向的是數組起始位置的話,訪問back-1所指向的元素就會越界,所以這里也涉及循環的問題

方法一: 把特殊情況分離出來

int myCircularQueueRear(MyCircularQueue* obj) {if(myCircularQueueIsEmpty(obj))return -1;if(obj->back==0)return obj->a[obj->k];elsereturn obj->a[obj->back-1];
}

方法二: 兩種情況統一處理

int myCircularQueueRear(MyCircularQueue* obj) {if(myCircularQueueIsEmpty(obj))return -1;return obj->a[(obj->back-1+obj->k+1)%(obj->k+1)];
}

5.判空

bool myCircularQueueIsEmpty(MyCircularQueue* obj) {return obj->front==obj->back;
}

6.判滿

bool myCircularQueueIsFull(MyCircularQueue* obj) {return (obj->back+1)%(obj->k+1)==obj->front;
}

7.銷毀隊列

void myCircularQueueFree(MyCircularQueue* obj) {free(obj->a);obj->front=obj->back=0;obj->k=0;
}

8.求隊列當前元素個數

當back在front之后時,back-front就可獲得當前隊列元素個數,但是當back在front前面時,back+(k+1)

可以讓back指向不處理循環問題本身應該指向的位置

int myCircularQueueSize(MyCircularQueue* obj) {return (obj->back+(k+1)-obj->front)%(k+1);
}

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

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

相關文章

顛覆與創新:算法備案的雙重挑戰

隨著數字時代的迅猛發展,算法已經成為了企業創新和競爭的關鍵因素。然而,伴隨著算法的廣泛應用,數據隱私、法規合規等問題也愈發凸顯,給企業帶來了雙重挑戰。本文將深入探討這一話題,探討算法備案如何在顛覆與創新之間…

IDEA、PHPSTORM 在命令行中進行 PHP debug

然在終端執行控制器的方法php yii test/ab 即可看到觸發debug 調試

視頻剪輯技巧:多個視頻合并新篇章,高效視頻剪輯,創造無限可能

在數字媒體時代,視頻剪輯已經成為一項重要的技能。多個視頻合并是一種將多個視頻片段合并成一個完整視頻的技巧。這種技巧可以將不同的視頻片段組合在一起,制作出獨特且具有吸引力的視頻內容。現在一起操作下云炫AI智剪如何批量合并視頻的操作吧。 一、準…

友思特分享 | Neuro-T:零代碼自動深度學習訓練平臺

來源:友思特 智能感知 友思特分享 | Neuro-T:零代碼自動深度學習訓練平臺 歡迎關注虹科,為您提供最新資訊! 工業自動化、智能化浪潮涌進,視覺技術在其中扮演了至關重要的角色。在汽車、制造業、醫藥、芯片、食品等行業…

針對CSP-J/S的每日一練:Day 11

一、審題 題目描述 給定兩個大小分別為 m m m 和 n n n 的正序(從小到大)數組 n u m s 1 nums1 nums1 和 n u m s 2 nums2 nums2。請你找出并返回這兩個正序數組的中位數。 算法的時間復雜度應該為 O ( l o g ( m n ) ) O(log (mn)) O(log(mn)) 。…

初學vue3與ts:路由跳轉帶參數

index-router <!-- 路由跳轉 --> <template><div><div class"title-sub flex"><div>1、用router-link跳轉帶參數id1&#xff1a;</div><router-link to"./link?id1"><button>點我跳轉</button>&…

maven 將Jar包安裝到本地倉庫

window系統&#xff1a; 注意事項&#xff1a;在windows中&#xff0c;使用mvn指令將jar安裝到本地倉庫時&#xff0c;一定要將相關資源使用“"”包裹上&#xff0c;不然會報下面的錯&#xff1a; mvn install:install-file "-DfileD:\BaiduNetdiskDownload\qianzixi…

管道在Vue和Angular中的作用及React的替代方案

管道在Vue和Angular中的作用及React的替代方案 前言管道起源管道特點 前端中管道概念和作用概念作用 React關于管道的替代方案Vue和Angular管道的區別 前言 本文主要講解管道在Vue和Angular中有哪些作用以及React對于管道概念的替代方案是什么。 管道起源 計算機中的Pipline…

PHP5.3 + Apache2.2 + Xdebug2.1.2環境并集成至PHPStrom全流程(解決使用最好的語言前的痛點問題)

文章目錄 問題背景安裝流程PHP安裝配置PHPApache安裝及配置PHPStrom集成PHP環境進行PHP開發 問題背景 由于公司陳舊項目的重新啟動&#xff0c;現需要對該項目開發微信登錄模塊&#xff0c;本人是寫 Java 的&#xff0c;但本著程序員終身學習、不懼新事物的特點&#xff0c;現…

NX二次開發UF_CSYS_set_wcs_display 函數介紹

文章作者&#xff1a;里海 來源網站&#xff1a;https://blog.csdn.net/WangPaiFeiXingYuan UF_CSYS_set_wcs_display Defined in: uf_csys.h int UF_CSYS_set_wcs_display(int display_status ) overview 概述 Set display of work coordinate system. 展示工作坐標系。 …

Android 11.0 默認開啟USB調試功能

Android 11.0 默認開啟USB調試功能 近來收到項目反饋需求想要默認開啟USB調試功能&#xff0c;默認開啟USB調試功能主要是在UsbDebuggingActivity.java文件中實現&#xff0c;具體修改參照如下&#xff1a; /vendor/mediatek/proprietary/packages/apps/SystemUI/src/com/and…

狀態模式 (State Pattern)

定義 狀態模式&#xff08;State Pattern&#xff09;是一種行為型設計模式&#xff0c;它允許一個對象在其內部狀態改變時改變它的行為。這種模式將每個狀態的行為封裝到對應的狀態類中&#xff0c;使得上下文&#xff08;Context&#xff09;的行為隨著其內部狀態的改變而改…

公眾號違禁詞及違規行為匯總

1、微信官方發布《微信公眾平臺關于清理集贊行為的公告》&#xff0c;全面禁止公眾賬號“集贊”玩法。 微信對違反微信用戶協議和公眾平臺協議的公眾號處理機制是&#xff0c;公眾號累計發現一次有集贊行為&#xff0c;封號7天&#xff1b;公眾號累計發現二次有集贊行為&#…

面試:ShardingSphere問題

文章目錄 什么是ShardingSphere&#xff0c;它的主要功能是什么&#xff1f;ShardingSphere的核心模塊有哪些&#xff1f;他們是如何工作的&#xff1f;ShardingSphere 的讀寫分離是如何實現的&#xff1f;如何配置ShardingSphere的數據分片策略&#xff1f;ShardingSphere支持…

【運維面試100問】(六)buffer和cache的區別

本站以分享各種運維經驗和運維所需要的技能為主 《python零基礎入門》&#xff1a;python零基礎入門學習 《python運維腳本》&#xff1a; python運維腳本實踐 《shell》&#xff1a;shell學習 《terraform》持續更新中&#xff1a;terraform_Aws學習零基礎入門到最佳實戰 《k8…

【Linux】匿名管道+進程池

文章目錄 前置知識一、管道的原理二、管道的特性三、管道的接口四、使用管道實現簡單的進程池解決進程池的一個小問題 前置知識 一個進程在創建時&#xff0c;會默認打開三個文件&#xff0c;分別是&#xff1a;stdin&#xff0c;stdout&#xff0c;stderr 進程中有一個維護進…

1linux

Is查看目錄內容 ls -ahil a表示全部&#xff0c;h表示文件大小以人類易讀的形式給出&#xff0c;i表示索引節點&#xff0c;l表示長列表形式。 cd 切換目錄 touch 創建文件 mkdir 創建目錄 mkdir Makedirectory&#xff0c;創建目錄&#xff0c;-p指定路徑&#xff0c;-m指定權…

炫我出席數字光影工作室專業建設論壇,受聘為專家委員會委員!

11月18日&#xff0c;炫我科技受邀參加在北京深瀾AI空間舉辦的2023數字光影工作室專業建設論壇。本次活動由北京市新媒體技師學院主辦、北京瀾景科技有限公司協辦&#xff0c;私有云售前技術工程師龔琛代表我司出席&#xff0c;并受聘為新媒體技師學院數字光影工作室專家委員會…

Mysql基礎操作(命令行)

文章目錄 Mysql基礎操作&#xff08;命令行&#xff09;背景創建數據庫選擇數據庫查看所有表查看表結構向表插入數據插入第一條插入第二條插入第三條 查詢表數據修改表數據刪除表數據 Mysql基礎操作&#xff08;命令行&#xff09; 背景 docker安裝mysql8&#xff0c;映射本地…

ubuntu下,PX4使用 upload 下載代碼沒反應

可能原因&#xff0c;沒有串口權限 sudo chmod 777 /dev/ttyACM0開啟串口權限&#xff0c;本次問題解決。