為充分利用向量空間,克服"假溢位
"現象的方法是:將向量空間想象為乙個首尾相接的圓環,並稱這種向量為迴圈向量。儲存在其中的佇列稱為迴圈佇列(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 原則處理資料節點。之所以用迴圈對列,就是了為了提高利用率。要不然每刪除乙個元素,對頭就空了乙...