佇列的順序表示和實現 01
初始的情況下,隊列當眾一個元素都沒有,讓 front = rear = 0
如果有元素入隊,要存放在 rear 所指位置,然後 rear++
出隊時,則需要從 front 指向元素開始,出一個,然後 front++
-------------------------------------------------------------------------------------
問:如下圖情況下,還有元素可以入隊嗎
下標:Q ~ MAXQSIZE - 1
設陣列大小為 MAXQSIZE,rear = MAXQSIZE 時,發生溢位
真溢位:若 front = 0,rear = MAXQSIZE 時再入隊為真溢位
假溢位:若 front ≠ 0,rear = MAXQSIZE 時再入隊為假溢位
解決假上溢的辦法:
① 將隊中元素依次向隊頭方向移動
缺點:浪費時間,每移動一次,隊中元素都要移動。
② 將隊空間設想成一個迴圈的表,即分配給佇列的 m 個儲存單元可以迴圈使用,當 rear 為 maxqsize 時,
若向量的開始端空著,又可以從頭使用空著的空間。當 front 為 maxqsize 時,也是一樣。如圖:
引入迴圈佇列:base[0] 接在 base[MAXQSIZE - 1] 之後,若 rear+1 == MAXQSIZE,則令 rear = 0
實現方法:利用模(mod,C語言中:%)運算
插入元素:Q.base[Q.rear] = x;
Q.rear = (Q.rear + 1) % MAXQSIZE;
刪除元素:x = Q.base[s.front]
Q.front = (Q.front + 1) % MAXQSIZE;
迴圈佇列:迴圈適用位佇列分配的儲存空間。
這種情況下,如何處理隊空和隊滿:
① 另外設一個標誌區別隊空、隊滿
② 另設一個變數,記錄元素個數
③ 少用一個空間
隊滿:(rear+1) % MAXQSIZE == front
頭指標加1對最高限制取餘其結果為front,也就是滿了