什麼是迴圈佇列?

2021-10-22 23:29:45 字數 1272 閱讀 3545

對於佇列最好的方法是使用鍊錶實現,因為對於陣列來說,佇列可能會出現下面這種情況:

如圖所示,不可以繼續新增元素,否則會造成陣列越界而遭致程式出錯。然而此時又不應該擴充陣列,因為還有大量實際空間未被占用。   

此時我們應該如何解決這個問題呢?我們將其實現為迴圈佇列。

何謂迴圈佇列?首先我們要說明的是迴圈佇列仍然是基於陣列實現的。但是為了形象化的說明問題,我們如下圖所示

1.圖中有兩個指標(其實就是兩個整數型變數,因為在這裡有指示作用,所以這裡理解為指標)front、rear,乙個指示隊頭,乙個指示隊尾。   

2.rear和front互相追趕著,這個追趕過程就是佇列新增和刪除的過程,如果rear追到head說明佇列滿了,如果front追到rear說明隊列為空。

3.我們把它掰彎,用的是求餘,這樣兩個值就不會跑出最大範圍,並且可以實現彎曲的效果,所以說對於迴圈佇列我們必須給定最大值maxqsize。

這其實是我們臆想的,反正我們要做的就是利用迴圈來解決空間浪費的問題。  

當新增乙個元素時,(rear+1)%maxqsize; //理解為什麼求餘?

當刪除乙個元素時,(front+1)%maxqsize;//理解為什麼求餘?

當rear=front的時候,佇列可能是滿,也可能是空。

在迴圈佇列中,當隊列為空時,有front=rear,而當所有佇列空間全佔滿時,也有front=rear。為了區別這兩種情況,規定迴圈佇列最多只能有maxsize-1個佇列元素,當迴圈佇列中只剩下乙個空儲存單元時,佇列就已經滿了。因此,佇列判空的條件是front=rear,而佇列判滿的條件是front=(rear+1)%maxsize。
因為存在滿和空兩種情況,我們需要分別判斷:

空:當佇列刪除元素到head=rear的時候,我們認為佇列空了。q.rear==q.front,不一定為0。

圖示:

靜態佇列為什麼必須是迴圈佇列

首先靜態佇列是基於陣列實現的,如果是普通陣列,規定font指向第乙個元素的位置,rear指向最後乙個元素位置的下乙個位置 假設現在進行入隊操作,此時 rear 後面 指標往後移動一位 出隊則是font向後移動一位,此時會出現乙個問題,就是已經刪除的元素所使用的空間無法繼續使用 因為每次入隊或者出隊都...

Js 什麼是 for迴圈

doctype html en utf 8 viewport content width device width,initial scale 1.0 x ua compatible content ie edge document title head console.log 1 for 迴圈 是...

什麼是訊息佇列?

訊息佇列有無數開源實現,一般沒必要自己實現。zmq也好rabbitmq也好甚至redis也好,找乙個合適的裝上用就行 就好像rdbms nosql一樣 技術都是解決問題的,訊息佇列解決的是將突發大量請求轉換為後端能承受的佇列請求,比如你的伺服器一秒能處理100個訂單,但秒殺活動1秒進來1000個訂單...