在循环队列的数组实现中,如果我们在前面指向第一个元素之前的一个槽并且指向最后一个元素,那么我们就会面临如何识别队列是满还是空的问题。
为解决这个问题,我们在缓冲区中使用计数器或浪费一个空格。
我在考虑以下方法。请纠正我在哪里出错,如果不是,请告诉我这是否是比上述更好/更差的解决方案。
答案 0 :(得分:3)
这种方法在逻辑上没有太大的错误。您将front
和rear
中的负值视为一种标志,表示队列为空。假设您更新front
和rear
的逻辑值保留0
.. size
范围内的值,您只需将其中一个设置为超出该范围即可指示队列是空的。
考虑这个选择。许多循环队列使用front
和rear
索引作为无符号值,size
作为2的幂。它们的值的更新总是递增,并允许它们环绕。这避免了调整这些指数的复杂逻辑。因为索引是无符号的,即使它们环绕,差异算法也能正常工作以确定元素的数量。
模数工作的技巧即使指数在增量上回绕,也是size
是2的幂。这可以确保环绕不会影响模数计算。
unsigned front_ = 0, rear_ = 0;
Type q_[SIZE];
unsigned getCount () { return rear_ - front_; }
bool isEmpty () { return getCount() == 0; }
bool isFull () { return getCount() == SIZE; }
bool enQ (Type val) {
bool result = !isFull();
if (result) q_[rear_++ % SIZE] = val;
return result;
}
bool deQ (Type *val) {
bool result = !isEmpty();
if (result) *val = q_[front_++ % SIZE];
return result;
}