迴圈佇列與鏈佇列的簡單實現

2021-08-18 22:03:44 字數 2187 閱讀 3887

為充分利用向量空間,克服"假溢位

"現象的方法是:將向量空間想象為乙個首尾相接的圓環,並稱這種向量為迴圈向量。儲存在其中的佇列稱為迴圈佇列(circular queue)。

通過上圖可以看出,如果使用順序表作為佇列的話,當處於d狀態則不能繼續插入新的隊尾元素,否則會因為陣列越界而導致程式**被破壞。

當隊列為空時,front和rear都指向頭結點;

入隊:在佇列尾部插入結點;

出隊:頭結點的後繼結點(隊頭)出隊,將頭結點的後繼改為他後面的結點,若煉表除頭結點外只剩乙個元素時,則需將rear指向頭結點。

一般情況下,鏈佇列的出隊圖示:

#include#include//鏈佇列結點結構  

typedef struct qnodeqnode;

//鏈佇列結構

typedef struct liqueueliqueue;

//建立鏈佇列

liqueue initqueue()

lq->front=lq->rear=null;

return *lq;

} //判斷鏈佇列是否為空

int isempty(liqueue *lq)else

} //元素進鏈佇列

void enqueue(liqueue *lq,int x)else

} //元素出鏈佇列

int dequeue(liqueue *lq,int *y)

if(lq->front==lq->rear)else

*y=p->data;

free(p);

return 1;

} //列印鏈佇列

從時間上,其實它們的基本操作都是常數時間,即都為0(1)的,不過迴圈佇列是事先申請好空間,使用期間不釋放,而對於鏈佇列,每次申請和釋放結點也會存在一些時間開銷,如果入隊出隊頻繁,則兩者還是有細微差異。

對於空間上來說,迴圈佇列必須有乙個固定的長度,所以就有了儲存元素個數和空間浪費的問題。而鏈佇列不存在這個問題,儘管他需要乙個指標域,會產生一些空間上的開銷,但也可以接受。所以在空間上,鏈佇列更加靈活。

總的來說,在可以確定佇列長度的情況下,建議用迴圈佇列;不能預估佇列長度時,建議用鏈佇列。

佇列 迴圈佇列與鏈佇列比較

對於迴圈佇列與鏈佇列的比較,可以從兩方面來考慮 1 從時間上,其實它們的基本操作都是常數時間,即都為0 1 的,不過迴圈佇列是事先申請好空間,使用期間不釋放,而對於鏈佇列,每次申請和釋放結點也會存在一些時間開銷,如果入隊出隊頻繁,則兩者還是有細微差異。2 對於空間上來說,迴圈佇列必須有乙個固定的長度...

09 迴圈佇列與鏈佇列

一 佇列與迴圈佇列 嵌入式 小j的天空 1.佇列 1 佇列 queue 是只允許在一端進行插入操作 而在另一端進行 刪除操作 的線性表。佇列是一種先進先出 fiirst in first out 的線性表,簡稱fifo。允許插入的一端稱為隊尾,允許刪除的一端稱為隊頭。從佇列的定義可知,佇列的入隊操作...

佇列 迴圈佇列與鏈隊

2.鏈隊 注意 佇列也是線性表,其特殊性在於有特殊的運算規則。即 隊結構只能在一端進行插入,該操作端稱為隊尾,另一端刪除元素,該操作端稱為隊頭。按照 先進先出 first in first out,fifo 原則處理資料節點。之所以用迴圈對列,就是了為了提高利用率。要不然每刪除乙個元素,對頭就空了乙...