将元素插入队列REAR = REAR + 1
时。当使用数组实现队列时,从队列中删除元素FRONT = FRONT + 1
。
现在,最初,表示队列的FRONT = REAR = -1
都是空的。添加第一个元素时,FRONT = REAR = 0
(假设数组从0到n-1)。
现在,如果我们假设FRONT = 0 and REAR = n-1
暗示队列已满的情况。当删除一些元素时,FRONT指针会改变。我们先说FRONT = 5 and REAR = 10
。因此,数组位置0到4是免费的。
当我希望现在添加元素时,我会在位置0和FRONT
处添加它。但是位置1,2,3和4是免费的。
但是,当我下次尝试插入元素时,编译器将抛出一个错误,说明队列已满。自FRONT = 0 and REAR = n-1
起。如何在其余位置插入并更好地理解这种排队算法?
我还想了解FRONT = REAR + 1
如何作为检查队列是否已满的条件?
答案 0 :(得分:1)
你想在这里用相对的圆形范围而不是绝对的线性范围来循环思考。因此,您不希望过多地关注FRONT
和REAR
的绝对索引/地址。它们彼此相对,你可以使用模运算来开始回到数组的开头,就像吃掉人类一样,当他离开屏幕的一侧时。当你将这些东西绘制成白板上的圆圈时,它会非常有用。
当我想现在添加一个元素时,我在0和FRONT点添加它。但是位置1,2,3和4是免费的。
我想在这里你有点倒退了。根据您的逻辑,插入会提前REAR
,而非FRONT
。在这种情况下,REAR
将为0,FRONT
仍然为5.如果再次推送,REAR=1
并且您将覆盖第一个索引,{{1仍然是5。
如果FRONT
和N=3
以及FRONT=2
,我们在推送和弹出很多内容后会在队列中有一个元素。当你推(入队)时,我们设置:REAR=2
制作REAR=(REAR+1)%N
,FRONT=2
给我们两个元素。如果我们再次推送,REAR=0
,FRONT=2
会给我们3个元素,并且队列已满。
目视:
REAR=1
......现在我们已经满了。如果 R
[..x]
F
R
[x.x]
F
R
[xxx]
F
中的下一个圆形索引是REAR
,则队列已满。在FRONT
,FRONT=2
的情况下,我们可以看到REAR=1
,因此它已满。
如果我们此时弹出(出列),我们会设置(REAR+1)%N == FRONT
,它看起来像这样:
FRONT=(FRONT+1)%N
我还想了解FRONT = REAR + 1如何作为检查队列是否已满的条件?
使用这种循环索引时,这还不够。我们需要稍微增加: R
[xx.]
F
时队列已满。我们需要模运算来处理那些“包裹到另一方”的情况。