循環隊列顯然更好,因爲它幫助我們使用彈出元素留下的空白區域。它還節省了每次彈出後可能用於元素橫向移動的時間。任何隊列優於循環隊列的用例?
但是有沒有比使用循環隊列優先考慮隊列的用例呢?
Queue =的定義我們將使用線性數組實現。遵循FIFO並且不覆蓋
Circular Queue = Ring Buffer Implementation的定義。遵循FIFO。不會覆蓋。
循環隊列顯然更好,因爲它幫助我們使用彈出元素留下的空白區域。它還節省了每次彈出後可能用於元素橫向移動的時間。任何隊列優於循環隊列的用例?
但是有沒有比使用循環隊列優先考慮隊列的用例呢?
Queue =的定義我們將使用線性數組實現。遵循FIFO並且不覆蓋
Circular Queue = Ring Buffer Implementation的定義。遵循FIFO。不會覆蓋。
注意:在很多語言中,queue
只是一個接口,並沒有提到任何關於實現的內容。
當使用基於數組的循環隊列,又名環形緩衝區時,您必須處理您推入完整緩衝區的情況。你可以:
這些選項都有缺點。如果你能和他們一起生活,或者你知道永遠不會填滿緩衝區,那麼環形緩衝區就是要走的路。
選項3 & 4會導致口吃。根據您的使用情況,您可能更喜歡較長但穩定的訪問時間和可靠性,而不是偶爾會出現峯值,因此選擇linked list
或其他類型的動態實現,如deque
。
例用例的任務,你必須達到一個穩定的幀/採樣率和吞吐量,你不能忍受斷斷續續,如:
但是,基於線性陣列的隊列將遭受同樣的負面影響。我沒有看到在循環隊列中選擇線性隊列的原因。
(除了稍高實現複雜度。)
std::queue
在C++使用一個deque
作爲默認墊層容器。 deque
本質上是一個動態數組數組,它似乎是大多數用例的一個很好的基礎,因爲它以小塊分配內存,因此會導致更少的口吃。
對不定義數據結構。我編輯了這個問題。你能否提供相同的實際用例? – david419
在所有情況下,循環隊列並不「明顯更好」。特別是,如果您需要一個無限制的隊列,這是一個糟糕的選擇,因爲當項目數量超過預先分配的大小時,最終不得不重新分配,然後在數組前端有未使用的空間時的項目減少。鏈表可以是一個更好的方式來實現一個無界的隊列。 –
在這種情況下,我們使用數組實現,所以兩者都是有界的。 – david419