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
时,队列已满。我们需要模运算来处理那些“绕到另一边”的情况