循環隊列的存儲空間
A. 設循環隊列的存儲空間為Q(1:50),初始狀態為front=rear=50。經過一系列正常的操作後,front-1=rear
該循環隊列中共rear-front+m=49個元素
所以尋找最大元素最壞情況需要49-1=48次
B. 設循環隊列的存儲空間為Q(1:35),初始狀態為front=rear=35.現經過一系列入隊與退隊運算後,
答案是0或35。前提條件是:此循環隊列的存儲空間全部用於存儲數據,而沒有留出一個存儲空間用於判別隊滿與隊空。
在上述循環隊列中,當front = rear時,
(1)有可能是隊空:先入隊15個元素,rear = 15;再出隊15個元素,front = 15。
(2)有可能是隊滿:先入隊15個元素,rear = 15;再出隊15個元素,front =
15;最後再入隊35個元素,rear指針循環一圈後再次等於15。
綜上,隊列中元素個數為0或35。
但應注意,上述的循環隊列由於無法判別隊滿與隊空,導致其產生二義性(即有歧義),可用性降低。因此,改進的方法是少用一個存儲空間,即隊列最大隻存儲34個元素,此時可用下列方法區分隊滿與隊空:
(1)隊滿:(rear + 1)% MaxSize == front
(2)隊空:rear == front
C. 循環隊列的存儲空間為(0:59),初始狀態為空,經過一系列正常的入隊與退隊操作後,front=25
設有一個用數組Q[1..m]表示的環形隊列,約定f為當前隊頭元素在數組中的位置,r為隊尾元素的後一位置(按順時針方向),若隊列非空,則計算隊列中元素個數的公式應為 (m+r-f)mod m
(60+24-25)mod 60 =59
分析:
對於順序隊列,頭指針和尾指針開始時刻都指向數組的0下標元素。當加入新元素以後,尾指針向後移動,指向最後一個元素的下一個位置。
但是尾指針不能超過數組的最大范圍。當有元素刪除時,頭指針向後移動。但是頭指針不能低於數組的0下標。這樣就會引入一種「假溢出」現象,
數組中存在空餘的空間,但是由於尾指針已經在最大位置,不能加入元素。
循環隊列就可以用來解決 假溢出 問題, 當隊列後面的滿了,就從頭在開始,形成頭尾相接的循環.
出現的問題: front=rear即頭指針和尾指針相等,但是對應兩種情況:一種是隊列是空,一種是隊列是滿。
所以,我們定義循環隊列中空出一個位置為滿隊列狀態。front指向頭元素,rear指向尾元素的下一個位置。
那麼循環隊列的長度如何計算呢?
情況一: 當rear大於front時,循環隊列的長度:rear-front
情況二: 當rear小於front時,循環隊列的長度:分為兩部分計算 0+rear 和 Quesize-front , 將兩部分的長度合並到一起即為: rear-front+Quesize
所以將兩種情況合為一種,即為: 總長度是(rear-front+Quesize)%Quesize