什么时候队列满了?

时间:2010-10-05 17:58:31

标签: data-structures queue

我已经看到很多方法来检查队列何时已满,但我不理解任何问题,所以用简单的话说什么时候队列已经满了?

(如果有代码请用C ++或伪代码制作)

我有这段代码来检查队列是否已满: -

myFront != (myBack+1) % max

(例如,为什么它不仅仅是“myBack == max”)

3 个答案:

答案 0 :(得分:2)

如果您没有更多空间来排队/插入新项目,无论是存储约束还是编程约束,队列都已满。 (假设其有界)

检查here(wikipedia),它显示了一个带有“大小”限制的C#示例。

代码段(来自上面的链接):

#region Constructor
public Queue(int Size)
 {
     this._Size = Size;
 }

 //Enqueue
if (this.IsFull())
{
    throw new Exception("Queue is full !");
}
... do enqueue

// check full
public virtual bool IsFull()
{
   return (this._Count == this._Size);
}

答案 1 :(得分:0)

Helper Method引用的维基百科文章en.wikipedia.org/wiki/Circular_buffer给出了一个非常好的解释(包括图表),我在此不再赘述。

“myFront!=(myBack + 1)%max”测试意味着代码使用“Always Keep One Slot Open”策略来检测完整队列;维基百科文章中的示例代码对“缓冲区已满”使用完全相同的测试(它们将其写为:(end + 1) % BUFFER_SIZE != start)。

如果不清楚,“(myBack + 1)%max”的目的是将1添加到myBack,如果结果== max,则将结果设置为0。

答案 2 :(得分:0)

这个问题似乎是关于用数组实现的循环队列。在这种情况下,myFrontmyBackmyBack+1必须都在[0,max)范围内。大多数情况下,您可以通过选中myFront != (myBack+1)来检查完整队列。这个简单检查不成立的另一个案例是myBack==max-1myFront==0。添加模%会使代码变得更简单,方法是将两个案例包装成一个(max-1)+1 % max == 0