佇列的線性實現 迴圈佇列

2021-10-08 08:27:20 字數 1068 閱讀 8629

之前說過,如果是單純乙個陣列就很容易造成假溢位,那麼就有人會想到,如果我把乙個陣列看成是乙個環,將最後乙個元素和第乙個元素連上(實際的儲存結構還是陣列,這個不可能連上),那麼是不是就可以解決假溢位了?

為了出對入隊方便,設兩個下標(int型)分別指向隊頭front(第乙個元素)和隊尾rear(最後乙個元素的下一位)。

那麼此時有計算公式:

插入:隊頭不變,rear = (rear+1)%length

刪除:隊尾不變,front = (front+1)%length

但是,在隊列為空的時候,隊頭隊尾的位置是相同的,在隊滿的時候,也是相同的。

正常儲存的案例:(紅筆為儲存元素的位子)

隊空:

隊滿:(這種是一直入隊沒有出隊,有出隊rear的位置也會變化)

(好叭我這個圖是真的醜)

1.簡單粗暴,用乙個bool型或者是int型變數儲存佇列狀態。

如果是插入了之後下標相同,那麼一定是隊滿,如果是刪除後相同,則隊空。

2.書上給的話是:少用乙個位置,在隊滿的時候隊頭指標在隊尾指標的下一位(沿著迴圈陣列的下一位)

不太好理解,那就上圖:

開始的時候同上,兩個指標位置都在a[0]處;

因為要保證隊滿front是rear的下乙個,則

因為rear的位置是下乙個元素插入的地方,而隊滿的就應該是這樣的,所以a[0]就不能放入

(如果有出隊不能放入的就不是a[0]了,而是其他的乙個位置)

兩種方法其實本質上都消耗了乙個位置,以分辨兩種情況。

因為還是陣列結構,如果在使用前不能確定儲存資料的數目,建議試應鍊錶佇列。

佇列 迴圈佇列的實現

為了可以重新利用佇列底層陣列中已刪除元素所佔的空間,消除可能出現的 假滿 現象,將順序佇列改進為迴圈佇列。迴圈佇列是首尾相連的佇列 當front rear變數達到底層陣列的capacity 1之後,再向前以為就變成0.入隊 1 判斷佇列是否已滿,已滿丟擲越界異常 2 不滿的話把元素查到隊尾,並且re...

佇列(一)迴圈佇列的線性儲存

include define false 0 define ok 1 define maxsize 5 定義乙個佇列結構 typedef struct sqqueue sqqueue 建立乙個空佇列 void initqueue sqqueue l 向佇列插入元素 int inqueue sqque...

佇列實現 迴圈佇列 鏈式佇列

佇列 queue 是一種類似棧的資料結構,棧是 後進先出 而佇列是 先進先出 佇列通常模擬進出一致的資料處理場景,例如訊息推送處理,中的購物處理等.迴圈佇列預備知識 鏈式佇列預備知識 include include define error 0 define ok 1 define true 1 d...