迴圈佇列實現

2021-08-22 14:54:44 字數 1268 閱讀 4198

假設是長度為5的陣列,初始狀態,空佇列如所示,front與 rear指標均指向下標為0的位置。然後入隊a1、a2、a3、a4, front指標依然指向下標為0位置,而rear指標指向下標為4的位置。 

出隊a1、a2,則front指標指向下標為2的位置,rear不變,如下圖所示,再入隊a5,此時front指標不變,rear指標移動到陣列之外 ,造成假溢位的現象。

為了解決這個問題,引入了迴圈佇列的概念

為了方便起見,約定:初始化建空隊時,令

front=rear=0,

當隊空時:front=rear

當隊滿時:front=rear 亦成立

因此只憑等式front=rear無法判斷隊空還是隊滿。  有兩種方法處理上述問題:

(1)增加乙個標識flag ,初始的時置為false,每當有元素入隊時讓flag = true,每當有元素出隊時,讓flag = false,在觸發rear = front 的上乙個操作決定了是空還是滿。這樣在判斷空的時候 ,要判斷 front == rear 和 flag 為假要同時成立,即( front == rear ) && !front 整體為真時,佇列空。( front == rear ) && front 時 佇列滿

(2)增加乙個引用計數count;

(3)少用乙個元素空間,約定以「佇列頭指標front在隊尾指標rear的下乙個位置上」作為佇列「滿」狀態的標誌。即:

隊空時: front=rear

隊滿時: (rear+1)%maxsize=front

//circular queue 迴圈佇列實現

#include #include #define maxsize 100

typedef int elemtype ;

typedef struct

circularqueue;

//初始化佇列

initqueue(circularqueue *q)

//入佇列操作

insertqueue(circularqueue *q, elemtype e)

//出佇列操作

deletequeue(circularqueue *q, elemtype *e)

實現迴圈佇列

利用陣列實現迴圈佇列,head tail並不能判斷佇列空與滿,需要另外加上乙個輔助 include include includeusing namespace std typedef struct node node define len 20 typedef int elemtype class...

迴圈佇列實現

迴圈佇列就是當資料寫到結尾後,在回到開頭接著寫,該過程類似迴圈鍊錶。如何實現這個到結尾後又轉到開頭呢?很簡單,取模操作!上兩個圖是迴圈佇列的兩種狀態,以下所寫的所有函式都可以對照著這兩幅圖來看。如下 filename buffer.h ifndef buffer h define buffer h ...

迴圈佇列實現

假設有n個資料採集執行緒負責採集資料,有1個入庫執行緒負責往資料庫寫資料,由於採集執行緒和入庫執行緒是非同步的,所以中間需要乙個快取區來作為採集執行緒和入庫執行緒之間通訊的橋梁,所以引入了迴圈佇列。假設有n個採集執行緒,1個入庫執行緒,架構圖如下 注意 1 由於採集執行緒入隊時,操作的是隊尾,有n個...