1. 程式人生 > >關於迴圈佇列的一些講解

關於迴圈佇列的一些講解

前面講到了佇列的“假溢位”,解決假溢位的辦法就是後面滿了,就再從頭開始,也就是頭尾相接的迴圈。我們把佇列的這種頭尾相接的順序儲存結構稱為迴圈佇列

比如昨天的例子,rear可以改為指向下標為0的位置,這樣就不會造成指標指向不明的問題了。

但是如果繼續進行入隊操作的話,比如繼續插入a6、a7,則rear指標就與front指標重合,同時指向下標為2的位置。

  • 此時問題又出來了,我們剛才說,空佇列時,等於rear,現在當佇列滿時,也是from等於rear,那麼如何判斷此時的佇列究竟是空還是滿呢?
  • 辦法一是設定一個標誌變數flag,當front == rear,且flag = 0時為佇列空,當front == rear,且flag= 1時為佇列滿。
  • 辦法二是當佇列空時,條件就是from = rear,當佇列滿時,我們修改其條件,保留一個元素空間。也就是說,佇列滿時,陣列中還有一個空閒單元。 如下圖所示,我們就認為此佇列已經滿了,也就是說,我們不允許上圖情況出現。

我們來討論第二種方法,由於rear可能比front大,也可能比front小,所以儘管它們只相差一個位置時就是滿的情況,但也可能是相差整整一圈。所以若佇列的最大尺寸為QueueSize,那麼佇列滿的條件是(rear+1) %QueueSize == front (取模“%的目的就是為了整合rear與front大小為一個問題)。

比如上面這個例子, QueueSize = 5,當 front=0,而 rear=4, (4+1) %5 = 0,所以此時佇列滿。再比如,front = 2而rear =1。(1 + 1) %5 = 2,所以此時 佇列也是滿的。而對於下圖, front = 2而rear= 0, (0+1) %5 = 1,1!=2,所以此時佇列並沒有滿。

另外,當rear > front時,此時佇列的長度為rear—front。但當rear < front時,佇列長度分為兩段,一段是QueueSize-front,另一段是0 + rear,加在一起,佇列長度為rear-front + QueueSize,因此通用的計算佇列長度公式為:

(rear—front + QueueSize) % QueueSize

有了這些講解,現在實現迴圈佇列的程式碼就不難了。具體的例子程式可以參照前面說的順序佇列。

  • 單是順序儲存,若不是迴圈佇列,演算法的時間效能是不高的,但迴圈佇列又面臨著陣列可能會溢位的問題,所以我們還需要研究一下不需要擔心佇列長度的鏈式儲存結構。

轉載自:

延伸閱讀

此文章所在專題列表如下: