我正在阅读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将帮助我们进行错误检查?请帮我提供示例代码。
感谢您的时间和帮助。
答案 0 :(得分:3)
因为如果数组的大小与插入最后一个元素的最大元素数相同会导致tail
等于head
,并且您将无法区分空队列和只需比较head
和tail
。
答案 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的开头,检查队列是否为空。
有意义吗?