資料結構 迴圈佇列

2022-03-11 10:31:58 字數 2207 閱讀 5182

附我的另一篇部落格:c_佇列的鏈式表示和描述

陣列表示的問題 

對於佇列最好的方法是使用鍊錶實現,因為對於陣列來說,佇列可能會出現下面這種情況:

如圖所示,不可以繼續新增元素,否則會造成陣列越界而遭致程式出錯。然而此時又不應該擴充陣列,因為還有大量實際空間未被占用。

此時我們應該如何解決這個問題呢?我們將其實現為迴圈佇列

理解迴圈佇列

何謂迴圈佇列?首先我們要說明的是迴圈佇列仍然是基於陣列實現的。但是為了形象化的說明問題,我們如下圖所示

1.圖中有兩個指標(其實就是兩個整數型變數,因為在這裡有指示作用,所以這裡理解為指標)front、rear,乙個指示隊頭,乙個指示隊尾。

2.rear和front互相追趕著,這個追趕過程就是佇列新增和刪除的過程,如果rear追到head說明佇列滿了,如果front追到rear說明隊列為空。

說明:令佇列空間中的乙個單元閒置,使得佇列非空時,q.rear與q.front之間至少間隔乙個空閒單。

3.我們把它掰彎,用的是求餘,這樣兩個值就不會跑出最大範圍,並且可以實現彎曲的效果,所以說對於迴圈佇列我們必須給定最大值maxqsize。這其實是我們臆想的,反正我們要做的就是利用迴圈來解決空間浪費的問題。  

迴圈佇列的實現過程

☆當新增乙個元素時,(rear+1)%maxqsize; //理解為什麼求餘?

☆當刪除乙個元素時,(front+1)%maxqsize;//理解為什麼求餘?

當rear=front的時候,佇列可能是滿,也可能是空。

因為存在滿和空兩種情況,我們需要分別判斷:

滿:當佇列新增元素到rear的下乙個元素是head的時候,也就是轉圈子要碰頭了,我們就認為佇列滿了。(q.rear+1)%maxsize=q.front

:當佇列刪除元素到head=rear的時候,我們認為佇列空了。q.rear==q.front,不一定為0

圖示:

佇列操作的一些說明

佇列長度:q.rear-q.front;

隊頭元素:q.base[q.front];

隊尾元素:q.base[q.rear-1]; 

新增操作

元素入隊時僅修改隊尾指標rear —— ++.

status enqueue(sqqueue *q,qelemtype e)

刪除操作元素出佇列時只修改隊頭指標front——++

status dequeue(sqqueue *q)

獲取佇列長度

int queuelength(sqqueue *q)

對節點的定義

#define maxqsize 100

typedef int qelemtype;

typedef int status;

typedef structsqqueue;

測試方法

void main()

2.6初始化佇列

sqqueue* initqueue()

資料結構 佇列 迴圈佇列

在佇列的陣列實現中,我們很容易發現數在出隊後,陣列的前面部分會有剩餘空間沒有被使用,所以我們為了最大程度的利用固定長度的陣列,我們採用迴圈佇列的儲存方式,這種方式的最大問題在於resize的時候比較麻煩,所以我們不考慮resize的情況。基本結構如下,這裡front指向第乙個元素的位置,rear指向...

資料結構 佇列 迴圈佇列

資料結構 佇列 迴圈佇列 順序儲存 犧牲乙個空間單元來判段佇列滿狀態。q.front q.rear 1 initsize date 2017 4 16 include define elemtype char define initsize 100 typedef structsqqueue voi...

資料結構 迴圈佇列

所謂順序儲存結構就是用一組位址連續的儲存單元依次存放從隊頭到隊尾的元素。宣告兩個指標rear front分別用來指示隊尾元素的下一位置和隊頭元素的位置。初始化時rear front 0 插入新的元素時尾指標加1,元素出佇列時隊頭指標加1。不過這樣做有個問題,不論是入隊還是出隊,隊頭或隊尾指標都是加1...