我已经看到很多方法来检查队列何时已满,但我不理解任何问题,所以用简单的话说什么时候队列已经满了?
(如果有代码请用C ++或伪代码制作)
我有这段代码来检查队列是否已满: -
myFront != (myBack+1) % max
(例如,为什么它不仅仅是“myBack == max”)
答案 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)
这个问题似乎是关于用数组实现的循环队列。在这种情况下,myFront
,myBack
和myBack+1
必须都在[0,max)
范围内。大多数情况下,您可以通过选中myFront != (myBack+1)
来检查完整队列。这个简单检查不成立的另一个案例是myBack==max-1
和myFront==0
。添加模%
会使代码变得更简单,方法是将两个案例包装成一个(max-1)+1 % max == 0
。