1.队列的概念
只允许在一端插入数据操作,在另一端进行删除数据操作的特殊线性表;进行插入操作的一端称为队尾(入队列),进行删除操作的一端称为队头(出队列);队列具有先进先出(FIFO)的特性。可以想像一下排队时的情景
队头移动,出队列时队头向后移动一个位置
如果还有新元素进行入队列容易造成假溢出。
- 假溢出:顺序队列因多次入队列和出队列操作后出现的尚有存储空间但不能进行入队列操作的溢出。
- 真溢出:顺序队列的最大存储空间已经存满二又要求进行入队列操作所引起的溢出。
循环队列
如何区分队空和队满呢?
三种方式:1、设置一个标志
初始值 flag = 0;入队列:flag = 1; 出队列:flag = 0;
队列为空时:(front == rear && flag == 0)
队列为满时:(front == rear && flag == 1)
2、约定如果队列的尾指针指向的下一位置是头指针的位置时,约定为满。
若相等则认为队满(注意:rear所指的单元始终为空);也就是front==rear(空),front==(rear+1)%size(满);
3、是使用一个计数器记录队列中元素的总数(实际上是队列长度)。
题解:
设某循环队列Q的定义中有front和rear两个域变量其中,front指示队头元素的位置,rear指示队尾元素之后的位置,如下图所示。若该队列的容量为M,则其长度为( )。
A. (Q.rear-Q.front +1)
B. [Q.rcar-a.front+M)
C. [Q.rear-Cl.front+1)%M
D.(Qrear-Q.front+M)%M
解:
为充分利用向量空间,克服"假溢出"现象的方法是:将向量空间想象为一个首尾相接的圆环,并称这种向量为循环向量。存储在其中的队列称为循环队列。这种循环队列可以以单链表的方式来在实际编程应用中来实现。
循环队列中,由于入队时尾指针向前追赶头指针;出队时头指针向前追赶尾指针,造成队空和队满时头尾指针均相等。
入队:入队时将新元素插入所指的位置,然后将加1。
queue[rear]=x;
rear=(rear+1)%size;
出队:出队时,删去所指的元素,然后将加1并返回被删元素。
tmp=queue[front];
front==(front+1)%size;
队列长度(元素的个数):(rear-front+size)%size;