Java 使用循环数组实现队列

Java 使用循环数组实现队列,java,data-structures,Java,Data Structures,我在互联网上发现了这些算法,但我不明白为什么在排队方法中我们将大小与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 算法大小(): 返回(N-f+r)模块N 算法排队(e): 如果size()=N-1,则 抛出FullQ

我在互联网上发现了这些算法,但我不明白为什么在排队方法中我们将大小与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
算法大小():
返回(N-f+r)模块N
算法排队(e):
如果size()=N-1,则
抛出FullQueueException

Q[r]您提供了一个非常糟糕(而且不正确)的实现

也就是说,数组中的循环队列通常从给定的索引开始,到另一个给定的索引结束(因此f和r)。但是,无论您做什么,队列中的项目都不能超过基础数组中的项目


这里的size函数用于计算队列中的元素数。如果该数字危险地接近总数组大小,则队列已满。

您提供了一个非常不正确的实现

也就是说,数组中的循环队列通常从给定的索引开始,到另一个给定的索引结束(因此f和r)。但是,无论您做什么,队列中的项目都不能超过基础数组中的项目


这里的size函数用于计算队列中的元素数。如果该数字非常接近总数组大小,则队列已满。

我同意@Matthew Flaschen的评论,但我会猜一猜。我怀疑队列是N长的,并且为哨兵保留了一个元素用于搜索。不过,我不会这么做。

我同意@Matthew Flaschen的评论,但我会猜一猜。我怀疑队列是N长的,并且为哨兵保留了一个元素用于搜索。但是,这不是我应该怎么做的。

给定循环队列的实现,其中开始和结束保持为分配的底层数组大小的模表示,例如N,队列(而不是数组)的实际容量必须小于N,否则,开始和结束标记将相等,空和满之间存在歧义

因此,当分配的底层数组大小为N时,队列的实际容量为N-1。这就是这次测试的原因


围绕这一点,有一些方法实际上允许使用所有N个插槽,并且消除了取索引模N时隐含的除法。

给定循环队列的实现,其中开始和结束作为以分配的底层数组的大小为模的指示符,例如N,队列(而不是数组)的实际容量必须小于N,否则开始和结束标记将相等,并且空和满之间存在歧义

因此,当分配的底层数组大小为N时,队列的实际容量为N-1。这就是这次测试的原因


有一些方法实际上允许使用所有N个插槽,并且消除了取索引模N时隐含的除法。

当大小为N-1时队列已满的原因是在这个简单的实现中,“r”表示下一个自由元素的索引,“f”表示要检索的下一个元素。如果“f”和“r”相等,则队列为空,因此如果递增“r”将导致其等于“f”,则队列已满

在此实现中,至少有一个元素始终为空。这通常比添加更多逻辑来区分“f”和“r”相等且队列已满的情况和队列为空的情况更有效

顺便说一句,在大多数处理器中,mod函数比使用这样的逻辑要昂贵得多:

Algorithm enqueue(e):
rNext<---r + 1
if rNext = N
    rNext<---0
if rNext = r then
    throw a FullQueueException
r<---rNext
Q[r]<---e
算法排队(e):

rNext当大小为N-1时,队列已满的原因是,在这个简单的实现中,“r”表示下一个空闲元素的索引,“f”表示要检索的下一个元素。如果“f”和“r”相等,则队列为空,因此如果递增“r”将导致其等于“f”,则队列已满

在此实现中,至少有一个元素始终为空。这通常比添加更多逻辑来区分“f”和“r”相等且队列已满的情况和队列为空的情况更有效

顺便说一句,在大多数处理器中,mod函数比使用这样的逻辑要昂贵得多:

Algorithm enqueue(e):
rNext<---r + 1
if rNext = N
    rNext<---0
if rNext = r then
    throw a FullQueueException
r<---rNext
Q[r]<---e
算法排队(e):

我们需要背景。这些不是算法。它们是一小段伪代码,我们需要上下文。这些不是算法。它们是psuedo代码的一小块;本文阐述:+1同意;本文详细介绍:@matin:首先,您仍然希望保持size(),因为这将是函数调用。==将检查是否相等不会编译。@matin:size()由于使用了模运算符,所以总是返回一个0..N-1范围内的数字。@matin:First,您希望保留size(),因为这将是函数调用。==将检查是否相等不会编译。@matin:size()由于使用了模运算符,所以总是返回一个范围为0..N-1的数字。