簡體   English   中英

使用循環數組實現隊列

[英]implementation of a queue using a circular array

我已經在互聯網上找到了這些算法,但我不明白為什么在入隊方法中我們將大小與N-1進行了比較??? 請幫我謝謝!!

Algorithm size():
return (N-f+r)mod N



Algorithm enqueue(e):
if size()=N-1 then
   throw a FullQueueException
Q[r]<---e
r<----(r+1)mod N

當大小為N-1時,隊列已滿的原因是,在此簡單實現中,“ r”代表下一個空閑元素的索引,而“ f”代表要檢索的下一個元素。 如果“ f”和“ r”相等,則隊列為空,因此如果遞增“ r”將導致其等於“ f”,則隊列已滿。

在該實現中,至少一個元素總是空的。 這通常比添加更多邏輯來區分“ f”和“ r”相等且隊列已滿與空的情況相比更為有效。

順便說一句,在大多數處理器中,mod函數比使用如下邏輯要昂貴得多:

Algorithm enqueue(e):
rNext<---r + 1
if rNext = N
    rNext<---0
if rNext = r then
    throw a FullQueueException
r<---rNext
Q[r]<---e

您提供了一個非常糟糕(且不正確)的實現。

話雖如此,數組中的循環隊列通常始於給定索引,並終止於另一個給定索引(因此f和r)。 但是,無論您做什么,隊列中的項目都不能超過基礎數組中的項目。

這里的size函數應該用於計算隊列中的元素數。 如果該數字危險地接近總陣列大小,則說明隊列已滿。

我同意@Matthew Flaschen的評論,但我會猜測。 我懷疑隊列的長度為N,並且為一個前哨保留了一個元素進行搜索。 不過,這不是我會做的。

給定一個循環隊列的實現,其中開始和結束都保持為已分配基礎數組的大小(例如N)的模數,則隊列(而非數組)的實際容量必須小於N,否則開始最終指標將是相等的,並且在空和滿之間會有歧義。

因此,當分配的基礎數組的大小為N時,隊列的真實容量為N-1。 這就是測試的原因。

圍繞這種情況,實際上有一些方法可以使用所有N個時隙消除將索引取n為模的隱式除法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM