Data structures 理解数据结构中的队列算法
将元素插入队列时,Data structures 理解数据结构中的队列算法,data-structures,queue,Data Structures,Queue,将元素插入队列时,REAR=REAR+1。当从队列中删除元素时,当使用数组实现队列时,FRONT=FRONT+1 现在,最初,这两个FRONT=REAR=-1都表示队列为空。添加第一个元素时,FRONT=REAR=0(假设数组从0到n-1) 现在,如果我们假设一个条件,其中FRONT=0,REAR=n-1表示队列已满。删除几个元素后,前指针会发生变化。让我们假设FRONT=5和reast=10。因此,数组位置0到4是空闲的 当我现在想要添加一个元素时,我会在位置0处添加,并且FRONT指向它。但
REAR=REAR+1
。当从队列中删除元素时,当使用数组实现队列时,FRONT=FRONT+1
现在,最初,这两个FRONT=REAR=-1
都表示队列为空。添加第一个元素时,FRONT=REAR=0
(假设数组从0到n-1)
现在,如果我们假设一个条件,其中FRONT=0,REAR=n-1
表示队列已满。删除几个元素后,前指针会发生变化。让我们假设FRONT=5和reast=10
。因此,数组位置0到4是空闲的
当我现在想要添加一个元素时,我会在位置0处添加,并且FRONT
指向它。但是位置1、2、3和4是免费的
但是,当我下次尝试插入元素时,编译器将抛出一个错误,表示队列已满。因为前部=0,后部=n-1
。如何在其余位置插入并更好地理解此排队算法
我还想了解
FRONT=REAR+1
如何作为检查队列是否已满的条件 在这里,你要循环地思考相对的、循环的范围,而不是绝对的、线性的范围。因此,您不想对前端
和后端
的绝对索引/地址过于关注。它们是相对的,你可以使用模运算回到数组的开头,就像吃豆人离开屏幕时一样。当你把这些东西画出来,在白板上把你的数组画成一个圆圈时,它会很有用
当我现在想要添加一个元素时,我会在位置0处添加元素,并将前面的点添加到元素中。但是位置1、2、3和4是免费的
我想你把它倒过来了。根据您的逻辑,插入会使后部向前推进,而不是前部向前推进。在这种情况下,后部
将为0,前部
仍将为5。如果再按一下,REAR=1
,就会覆盖第一个索引,FRONT
仍然是5
如果N=3
和FRONT=2
和REAR=2
,则在大量推送和弹出后,队列中有一个元素。当你推(排队)时,我们设置:REAR=(REAR+1)%N
使FRONT=2
,REAR=0
给我们两个元素。如果我们再按一下,FRONT=2
,REAR=1
给我们3个元素,队列就满了
视觉上:
R
[..x]
F
R
[x.x]
F
R
[xxx]
F
。。。现在我们吃饱了。如果后方
的下一个循环索引是前方
,则队列已满。在FRONT=2
,REAR=1
的情况下,我们可以看到(REAR+1)%N==FRONT
,所以它是满的
如果我们在此时弹出(退出队列),我们将设置FRONT=(FRONT+1)%N
,如下所示:
R
[xx.]
F
我还想了解FRONT=REAR+1如何作为检查队列是否已满的条件
当您使用这种循环索引时,这是不够的。我们需要稍微增加一点:当FRONT==(后轮+1)%N
时,队列已满。我们需要模运算来处理那些“绕到另一边”的情况