[英]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.