了解数据结构中的队列算法

时间:2015-05-29 13:47:05

标签: data-structures queue

将元素插入队列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如何作为检查队列是否已满的条件?

1 个答案:

答案 0 :(得分:1)

你想在这里用相对的圆形范围而不是绝对的线性范围来循环思考。因此,您不希望过多地关注FRONTREAR的绝对索引/地址。它们彼此相对,你可以使用模运算来开始回到数组的开头,就像吃掉人类一样,当他离开屏幕的一侧时。当你将这些东西绘制成白板上的圆圈时,它会非常有用。

当我想现在添加一个元素时,我在0和FRONT点添加它。但是位置1,2,3和4是免费的。

我想在这里你有点倒退了。根据您的逻辑,插入会提前REAR,而非FRONT。在这种情况下,REAR将为0,FRONT仍然为5.如果再次推送,REAR=1并且您将覆盖第一个索引,{{1仍然是5。

如果FRONTN=3以及FRONT=2,我们在推送和弹出很多内容后会在队列中有一个元素。当你推(入队)时,我们设置:REAR=2制作REAR=(REAR+1)%NFRONT=2给我们两个元素。如果我们再次推送,REAR=0FRONT=2会给我们3个元素,并且队列已满。

目视:

REAR=1

......现在我们已经满了。如果 R [..x] F R [x.x] F R [xxx] F 中的下一个圆形索引是REAR,则队列已满。在FRONTFRONT=2的情况下,我们可以看到REAR=1,因此它已满。

如果我们此时弹出(出列),我们会设置(REAR+1)%N == FRONT,它看起来像这样:

FRONT=(FRONT+1)%N

我还想了解FRONT = REAR + 1如何作为检查队列是否已满的条件?

使用这种循环索引时,这还不够。我们需要稍微增加: R [xx.] F 时队列已满。我们需要模运算来处理那些“包裹到另一方”的情况。