Arrays 循环队列中的满/空缓冲区区分

Arrays 循环队列中的满/空缓冲区区分,arrays,algorithm,data-structures,queue,circular-buffer,Arrays,Algorithm,Data Structures,Queue,Circular Buffer,在循环队列的数组实现中,如果前面指向第一个元素之前的一个插槽,后面指向最后一个元素,那么我们将面临如何识别队列是满的还是空的问题 为了解决这个问题,我们要么使用一个计数器,要么在缓冲区中浪费一个空间 我在考虑以下方法。请纠正我哪里出了问题,如果没有,请告诉我这是否是比上述更好/更糟糕的解决方案 前面指向第一个元素,后面指向最后一个元素; 具有检查队列是否只剩下1个元素的功能; 如果我们要去除最后一个元素,则使前后-1; 如果前面和后面都是-1,则isEmpty为真; 如果前=后+1%尺寸,则is

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

为了解决这个问题,我们要么使用一个计数器,要么在缓冲区中浪费一个空间

我在考虑以下方法。请纠正我哪里出了问题,如果没有,请告诉我这是否是比上述更好/更糟糕的解决方案

前面指向第一个元素,后面指向最后一个元素; 具有检查队列是否只剩下1个元素的功能; 如果我们要去除最后一个元素,则使前后-1; 如果前面和后面都是-1,则isEmpty为真; 如果前=后+1%尺寸,则isFull为真。
这种方法在逻辑上没有多大错误。您将前后的负值视为一种标志,以指示队列为空。假设更新前后的逻辑将值保持在0..size范围内,则只需将其中一个值设置为超出该范围即可指示队列为空

考虑一下这个替代方案。许多循环队列使用前后索引作为无符号值,大小为2的幂。它们的值的更新总是递增的,并且允许它们环绕。这避免了调整这些指标的复杂逻辑。因为索引是无符号的,即使它们是环绕的,差分算法也能正确地确定元素的数量

即使指数在增量上缠绕,模量仍然有效的诀窍是大小是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;
}

但是,无符号整数有上限。当它达到上限时,只有上帝知道会发生什么。@guo:使用unsigned的意义在于它的溢出行为是由C标准定义的。