使用链表实现队列是最好的方法。 对于数组,队列可能如下:
如图所示,不能继续添加元素。 否则,数组将越界,导致程序错误。 但是,由于还没有占用很多实空间,所以此时不应该扩展数组。
这个时候我们应该怎么解决这个问题呢? 我们将这作为循环队列来实现。
循环队列是什么是循环队列? 首先,说明循环队列仍然是基于数组实现的。 但是,为了形象化问题,如下图所示
1 .图中有两个指针(其实有两个整数型变量。 这里有指示作用,所以这里理解为指针) front,rear,一个是指示队的头,一个是指示队的尾。
2.rear和front互相追赶。 此跟踪过程是添加和删除队列的过程,当rear赶上head时队列已满,当front赶上rear时队列为空。
3 .我们把它打碎得很小,想要剩下的。 这样,两个值不会超出最大范围,可以得到弯曲的效果。 所以,必须对循环矩阵给出最大值MAXQSIZE。
这其实是我们推测的。 总之,我们要做的是利用循环解决空间浪费的问题。
添加循环队列实现进程元素时,(rear 1) %MAXQSIZE; //理解为什么要求余数吗?
删除一个元素时,(前1 ) %MAXQSIZE; //理解为什么要求余数吗?
如果rear=front,则队列可能已满,也可能空闲。
在循环队列中,如果队列为空,则有front=rear;如果所有队列空间都已满,则有front=rear。 为了区分这两种情况,规定循环队列最多只能有MaxSize-1一个队列元素,如果循环队列中只有一个空存储单元,则队列已满。 因此,队列为空的条件是front=rear,队列满的条件是front=(rear 1) %MaxSize。 有满和空两种情况,我们需要分别判断:
完整:如果队列将元素添加到rear,并且下一个元素是head,即,在旋转圈子等待时,队列将满。 (Q.rear 1) %MAXSIZE=Q.front
空:如果队列将元素删除到head=rear,则认为队列为空。 Q.rear==Q.front,不一定是0。
图标: