[英]Error checking in queue implementation in C++
我正在閱讀Robert Sedwick在C ++中的算法中關於FIFO隊列數組實現的內容。隊列的內容是數組中“head”和“tail”之間的所有元素,考慮到結束時回繞到0遇到數組。 如果“head”和“tail”相等,那么我們認為隊列是空的; 但如果“put”會使之相等,那么我們認為它是完整的。 我們使數組1的大小大於客戶端期望在隊列中看到的最大元素數,以便我們可以預測此程序進行錯誤檢查。
template <class Item>
class QUEUE
{
private:
Item *q; int N, head, tail;
public:
QUEUE(int maxN)
{ q = new Item[maxN+1];
N = maxN+1; head = N; tail = 0; }
int empty() const
{ return head % N == tail; }
void put(Item item)
{ q[tail++] = item; tail = tail % N; }
Item get()
{ head = head % N; return q[head++]; }
};
我的問題為什么在文本中提到的作者分配的數組1大於用於進行錯誤檢查的用戶。 我沒有得到如何分配比用戶請求更大的1將幫助我們進行錯誤檢查? 請幫我提供示例代碼。
謝謝你的時間和幫助。
因為如果數組與插入最后一個元素的元素的最大數量具有相同的大小將導致tail
變得等於head
,並且您將無法通過比較head
和tail
來區分空隊列和完整隊列。
我認為,如果沒有額外的單元格,就無法區分具有maxN元素和空隊列的隊列,因為在這兩種情況下,head和tail將在模塊maxN中處於相同的等價類中。
所以,我猜錯誤處理可以在put之后立即完成,以檢查是否滿足空標准(這意味着超出了容量):
void put(Item item)
{
q[tail++] = item;
tail = tail % N;
// check that capacity is not exceeded.
if (head % N == tail)
throw;
}
同樣在get的開頭,檢查隊列是否為空。
是否有意義?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.