循环队列中的完全/空缓冲区分

时间:2014-09-20 01:31:48

标签: arrays algorithm data-structures queue circular-buffer

在循环队列的数组实现中,如果我们在前面指向第一个元素之前的一个槽并且指向最后一个元素,那么我们就会面临如何识别队列是满还是空的问题。

为解决这个问题,我们在缓冲区中使用计数器或浪费一个空格。

我在考虑以下方法。请纠正我在哪里出错,如果不是,请告诉我这是否是比上述更好/更差的解决方案。

  1. 指向前面的第一个元素,后面指向最后一个元素;
  2. 有一个功能来检查Queue是否只剩下1个元素;
  3. 如果我们要对最后一个元素进行dequeing,请使前后-1;
  4. isEmpty()如果​​前面和后面都是真的后面是-1;
  5. 如果前=(后+ 1)%大小,
  6. isFull将为真。

1 个答案:

答案 0 :(得分:3)

这种方法在逻辑上没有太大的错误。您将frontrear中的负值视为一种标志,表示队列为空。假设您更新frontrear的逻辑值保留0 .. size范围内的值,您只需将其中一个设置为超出该范围即可指示队列是空的。

考虑这个选择。许多循环队列使用frontrear索引作为无符号值,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;
}