我在互联网上找到了这些算法,但我无法理解为什么在enqueue方法中我们将大小与N-1进行比较?请帮助我谢谢!!
Algorithm size():
return (N-f+r)mod N
Algorithm enqueue(e):
if size()=N-1 then
throw a FullQueueException
Q[r]<---e
r<----(r+1)mod N
答案 0 :(得分:1)
您提供了一个非常破碎(且不正确)的实现。
话虽如此,数组中的循环队列通常从给定索引开始,并以另一个给定索引结束(因此f和r)。但是,无论您做什么,队列中的项目都不能比基础数组中的项目多。
这里的size函数应该计算队列中元素的数量。如果该数字危险地接近总数组大小,则队列已满。
答案 1 :(得分:1)
我同意@Matthew Flaschen的评论,但我会猜测。我怀疑队列是N长,并且一个元素被保留用于搜索的标记。但是,我不是这样做的。
答案 2 :(得分:1)
给定循环队列的实现,其中开始和结束保持为以分配的底层数组的大小为模的指标,比如N,有必要队列(而不是数组)的实际容量小于N,否则,开始和结束指标将是相等的,空和完全之间会有歧义。
因此,当分配的底层阵列的大小为N时,队列的真实容量为N-1。这就是测试的原因。
有很多方法可以实际允许使用所有N个插槽 AND 消除以索引模n为中隐含的除法。
答案 3 :(得分:1)
当大小为N-1时队列已满的原因是在这个简单的实现中,'r'表示下一个自由元素的索引,'f'表示要检索的下一个元素。如果'f'和'r'相等,则队列为空,因此如果递增'r'将导致它等于'f',则队列已满。
在此实现中,至少有一个元素始终为空。这通常比添加更多逻辑更有效,以区分“f”和“r”相等并且队列已满的情况与其为空的情况。
BTW,在大多数处理器中,mod函数比使用这样的逻辑要昂贵得多:Algorithm enqueue(e):
rNext<---r + 1
if rNext = N
rNext<---0
if rNext = r then
throw a FullQueueException
r<---rNext
Q[r]<---e