在C ++中检查队列实现时出错

时间:2012-08-24 09:28:43

标签: c++ algorithm

我正在阅读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将帮助我们进行错误检查?请帮我提供示例代码。

感谢您的时间和帮助。

2 个答案:

答案 0 :(得分:3)

因为如果数组的大小与插入最后一个元素的最大元素数相同会导致tail等于head,并且您将无法区分空队列和只需比较headtail

即可

答案 1 :(得分:0)

我认为,如果没有额外的单元格,就无法区分具有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的开头,检查队列是否为空。

有意义吗?