使用循环数组实现队列

时间:2010-06-05 15:58:25

标签: java data-structures

我在互联网上找到了这些算法,但我无法理解为什么在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

4 个答案:

答案 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