python迴圈佇列 關於迴圈佇列的一些講解

2021-10-18 15:25:16 字數 1450 閱讀 3827

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

比如昨天的例子,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

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

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

延伸閱讀

迴圈佇列(進隊,出隊)

描述 根據給定的空間構造順序迴圈佇列,規定隊滿處理方法為少用乙個元素空間。例如,給定5個元素空間構造迴圈佇列,則只能存放4個元素。試根據入隊及出隊操作判斷佇列最後的元素存放情況,並輸出最後佇列中的元素值,即完成給定入隊及出列操作後一次性全部出隊的元素值。要求採用順序佇列完成。輸入輸入的第一行為乙個自...

佇列 迴圈佇列與鏈隊

2.鏈隊 注意 佇列也是線性表,其特殊性在於有特殊的運算規則。即 隊結構只能在一端進行插入,該操作端稱為隊尾,另一端刪除元素,該操作端稱為隊頭。按照 先進先出 first in first out,fifo 原則處理資料節點。之所以用迴圈對列,就是了為了提高利用率。要不然每刪除乙個元素,對頭就空了乙...

python實現迴圈佇列 迴圈佇列Python

我試圖在python中建立乙個迴圈佇列,以便在到達陣列中的最後乙個元素時指向頭部。我正在研究排隊方法,我遇到了一些問題。我正在嘗試使用乙個大小為4的陣列,並且能夠將值排隊到第4個點,但是當它執行elif語句時,我收到這個錯誤。typeerror 不支援 的運算元型別 node 和 int 有什麼想法...