一、佇列與迴圈佇列
(嵌入式_小j的天空)
1.佇列
(1)佇列(queue)是只允許在一端進行插入操作
,而在另一端進行
刪除操作
的線性表。佇列是一種先進先出(fiirst in first out)的線性表,簡稱fifo。允許插入的一端稱為隊尾,允許刪除的一端稱為隊頭。
從佇列的定義可知,佇列的入隊操作,其實就是在隊尾追加乙個元素,不需要移動任何元素,因此時間複雜度為o(1)。佇列的刪除操作,與棧不同的是,佇列元素的出列是在隊頭,即小標為0的位置,若要刪除乙個元素的話,需要移動佇列的所有元素,因此事件複雜度為o(n)。
(2)front/rear指標:為了避免當只有乙個元素時,隊尾和隊頭重合使處理變得麻煩,所有引入兩個指標,front指標指向隊頭元素,rear指標指向隊尾元素的下乙個位置
,這樣當front等於rear時,隊列為空(空佇列)而不是佇列還剩下乙個元素。
2.佇列的抽象資料型別
adt 佇列
data
同線性表。元素具有相同的型別,相鄰元素具有前驅和後繼關係。
operation
initqueue(*q): 初始化操作,建立乙個空佇列q.
destoryqueue(*q):若佇列q存在,則銷毀它。
clearqueue(*q):將佇列q清空
gethead(q,*e):若佇列q存在且非空,用e返回佇列q的隊頭元素。
enqueue(*q,e):若佇列q存在且非空,插入新元素e到佇列q中並稱為隊尾元素。
dequeue(*q,*e):刪除佇列q中隊頭元素,並用e返回其值
queuelength(q):返回佇列q的元素個數
endadt
3.迴圈佇列
(1)定義
:佇列中頭尾相接的順序儲存結構稱為迴圈佇列,用於解決"假溢位"問題。
(2)隊滿條件:
一般情況,當front=rear時,佇列可能為空佇列也可以為滿佇列。所以我們假設,當front==rear時隊列為空;當佇列滿時,陣列還有乙個空閒空間。由於rear可能比front大,也可以比front小。我們這樣定義,當佇列滿足條件"(rear+1)%queuesize==front"時,我們就認為佇列已滿(queuesize為佇列最大儲存容量)。
(3)佇列長度公式
當rear>front時,佇列的長度為rear-front;當rear
(rear-front+queuesize)%queuesize
(4)迴圈佇列的順序儲存結構
typedef int qelemtype
typedef struct
sqqueue;
(5)迴圈佇列的相關操作
a.初始化乙個迴圈佇列q
status initqueue(sqqueue *q)
b.計算迴圈佇列的長度
/*返回q的元素個數,即佇列的當前長度*/
int queuelength(sqqueue q)
c.迴圈佇列插入操作
實現:若佇列未滿,則插入元素e為新的隊尾元素
status enqueue(sqqueue *q,qelemtype e)
d.迴圈佇列刪除操作
實現:若佇列不空,則刪除q中隊頭元素。用e返回其值
status enqueue(sqqueue *q,qelemtype *e)
qnode,*queueptr;
/*佇列的鍊錶結構*/
typedef struct
linkqueue;
3.鏈佇列的入隊操作
演算法:實質為鍊錶尾插入結點,尾指標指向新結點 a.
為新結點s開闢一段空間,並判斷是否儲存分配成功;
b.將插入元素存到新結點s的資料域,並初始化s的指標域; c.
把擁有元素e新結點s賦值給原佇列結點的後繼; d.
把當前的s設定為隊尾結點,rear指向s
實現:插入元素e為q的新隊尾元素
status enqueue(linkqueue *q,qelemtype e)
4.鏈佇列的刪除操作演算法:實質是頭結點的後繼結點出隊
,將頭結點的後繼改為他後面的結點。若煉表除頭結點外,只剩下乙個元素時,則需將rear指向頭結點。
a.定義乙個
queueptr結點p,用於暫存欲刪除的結點q->front-next;
b.將欲刪除結點資料域資料賦值給e;
c.將欲刪除結點的後繼結點(
p->next
)賦值給頭隊頭結點的後繼(
q->front->next)
d.判定
若隊頭是隊尾,則刪除後將rear指向頭結點,最後再釋放欲刪除結點p.
實現:若佇列不空,刪除q的隊頭元素,用e返回其值,並返回ok,否則返回error
status enqueue(linkqueue *q,qelemtype e)
三、迴圈佇列與鏈佇列效能分析 1.
迴圈佇列與鏈佇列基本操作時間複雜度均為o(1);
2.迴圈佇列事先申請好空間,使用期間不釋放;鏈佇列,無需事先申請空間但是每次申請和釋放結點會存在一些事件開銷;
3.迴圈佇列必須有乙個固定的長度,可能存在空間浪費;鏈佇列需要乙個指標域,會產生一些空間上的開銷,所以在可以確定佇列長度最大值的情況下建議用迴圈佇列。
09 迴圈佇列與鏈佇列
一 佇列與迴圈佇列1.佇列 1 佇列 queue 是只允許在一端進行插入操作,而在另一端進行刪除操作的線性表。佇列是一種先進先出 fiirst in first out 的線性表,簡稱fifo。允許插入的一端稱為隊尾,允許刪除的一端稱為隊頭。從佇列的定義可知,佇列的入隊操作,其實就是在隊尾追加乙個元...
佇列 迴圈佇列與鏈佇列比較
對於迴圈佇列與鏈佇列的比較,可以從兩方面來考慮 1 從時間上,其實它們的基本操作都是常數時間,即都為0 1 的,不過迴圈佇列是事先申請好空間,使用期間不釋放,而對於鏈佇列,每次申請和釋放結點也會存在一些時間開銷,如果入隊出隊頻繁,則兩者還是有細微差異。2 對於空間上來說,迴圈佇列必須有乙個固定的長度...
佇列 迴圈佇列與鏈隊
2.鏈隊 注意 佇列也是線性表,其特殊性在於有特殊的運算規則。即 隊結構只能在一端進行插入,該操作端稱為隊尾,另一端刪除元素,該操作端稱為隊頭。按照 先進先出 first in first out,fifo 原則處理資料節點。之所以用迴圈對列,就是了為了提高利用率。要不然每刪除乙個元素,對頭就空了乙...