資料結構與演算法 佇列 迴圈佇列

2021-10-05 11:52:13 字數 2530 閱讀 8675

部分內容來自於《資料結構(c語言版)>>(清華大學出版社, 嚴蔚敏/吳偉民 編著)

如果我們將佇列設定為順序儲存結構, 那麼, 因為出隊的時候是從隊首出隊, 入隊的時候是從隊尾入隊, 而入隊需要在後面的記憶體中開闢空間, 一直這樣總會把所有的記憶體耗盡. 雖然我們在出隊的時候會釋放空間, 但是釋放的空間是在靠前的記憶體位址, 我們入隊的時候是使用的佇列後面的記憶體位址, 所以, 總會有乙個時候, 佇列後面的記憶體位址會被耗近, 但是佇列的前面還有記憶體, 所以我們將順序佇列想象為迴圈佇列來防止這種情況的發生.

由於當隊列為空和隊列為滿的時候front 和 rear指標都是處於重合狀態, 所以我們應該設定乙個佇列結束的標誌或者一直少用乙個空間

在這裡我們使用後者,一直少用乙個空間來保證front == rear 的時候一定表示為空佇列

注意 :

在這裡, 將佇列的結構想象成乙個環, 索引只是代表了位置, 與佇列的前後端無關, 也就是說, front 和 rear 的索引的大小關係不確定, 當出隊的時候, front 的索引通常會變大(在到達了上限時候會回到0重新開始迴圈), 而在入隊的時候, rear的索引通常會變小(在到達了上限的時候會回到0重新開始迴圈), 具體情況請看下方"出隊"與"入隊"

typedef

int qelemtype;

typedef

struct

sqqueue;

//**** : 《資料結構(c語言版)>>(清華大學出版社, 嚴蔚敏/吳偉民 編著), 稍有改動

依然是順序儲存結構

status initqueue

(sqqueue& q)

;//**** : 《資料結構(c語言版)>>(清華大學出版社, 嚴蔚敏/吳偉民 編著), 稍有改動

初始化front和rear為0

初始空間為100

status enqueue

(sqqueue& q, qelemtype e)

q.base[q.rear]

= e;

q.rear =

(q.rear +1)

% q.size;

return ok;

}//**** : 《資料結構(c語言版)>>(清華大學出版社, 嚴蔚敏/吳偉民 編著), 稍有改動

在隊尾入隊, 入隊之後, 新的rear的位置為rear+1對最大容量取模.

為什麼要對容量上限取模 ?

假設迴圈佇列在此之前都沒有出隊. 此時front的索引為0, max = 100, 假設rear 為小於99的數值, 則rear的後面的空間都是可以使用的, 此時(rear+1)對100取模, 等效於rear++; 如果rear == 99, 則rear+1對100取模為0, 與front的索引相同, 說明空間已滿, 擴容.

假設迴圈佇列在此之前有過出隊情況. 此時front的索引大於0, 當rear的索引小於99的時候, 與上述情況相同, 當rear==99的時候, 此時(rear+1)對100取模為0, 與front不同, 所以隊尾的索引變為了0;

status dequeue

(sqqueue& q, qelemtype& e)

//**** : 《資料結構(c語言版)>>(清華大學出版社, 嚴蔚敏/吳偉民 編著), 稍有改動

front為隊頭元素, 出隊之後, fron為 (q.front + 1) % q.size;

取模的原因同上

status destory

(sqqueue& q)

釋放空間, 指標置空, 容量置為0

status clear

(sqqueue& q)

將頭尾指標索引置為0

bool isempty

(sqqueue& q)

隊列為空的條件為頭尾指標重合

int

queuelength

(sqqueue q)

//**** : 《資料結構(c語言版)>>(清華大學出版社, 嚴蔚敏/吳偉民 編著)

如果rear的索引大於front的索引, 則加上size之後對size取模不變

如果rear的索引小於front的索引 :

直接返回q.front即

資料結構與演算法 迴圈佇列鏈式佇列

佇列 1 也是一種操作受限的線性表,規定只能在一端插入,一端刪除,有先進先出的特點。2 順序佇列,隊首指標指向隊首元素,隊尾指標指向隊尾元素的前乙個元素,此時隊列為空的判定條件是 q.front q.rear 0 2 順序佇列會有假溢位的現象,為此設計了迴圈佇列。1 為了區分隊滿和隊空的條件,迴圈佇...

資料結構與演算法 佇列(佇列 迴圈佇列 鏈式佇列)

和昨天的棧有一些類似,小孱弱弱今天分享的資料結構 佇列,那是非常有意思 顧名思義呀,佇列佇列,就是排隊呀,應該還記得棧的資料操作模式吧,僅在棧尾進行插入和刪除操作,我們的佇列呢,僅在佇列頭部刪除,佇列尾部插入,這就很清楚了吧,佇列的應用很廣泛,一定要搞清楚裡面的思想哦。進入正題 先是迴圈佇列,為什麼...

資料結構與演算法 迴圈佇列

迴圈佇列 實際中我們還會用到一種佇列叫做迴圈佇列,這種佇列把儲存空間前後連線起來,形成像環一樣的結構,解決了記憶體空間浪費的問題 這裡我們用順序結構來實現,因為為了防止溢位的情況,這裡我們需要多開乙個資料的空間用作緩衝,這部分不用於存資料,用於防止溢位,當陣列訪問到這一部分時就將他歸零,實現迴圈的結...