在学习完堆栈和队列中的堆栈的内容后我们接着学习了堆栈和队列中队列的内容。
栈和队列都是特许的线性表,和栈不同的是队列的特点是先进先出。
1、 队列的定义:队列简称为队,是限定只能在表的一端作为插入运算、在另一端作删除运算的线性表;在表中,允许插入的一段称作“队尾”,允许删除的另一端称作“队首”(或“队头”);通常将元素插入队尾的操作称作为入队列(或者入队),称删除队首元素的操作为出队列(或出队)。其结构大致如下图所示:
2、 队列的存储结构:
队列的存储结构主要有以下两种
(1)顺序队列——采用顺序结构存储
(2)链式队列——采用链式结构存储
其中我们主要学习了顺序队列操:
顺序队列操作:顺序队列中两个指针一个表示队头(front)一个表示队尾(rear)。在元素入队操作时,只有rear指针发生变化(元素入队时,指针会向后移动)front指针保持不动,因为顺序队列的插入时从队尾插入;在元素出队时front指针发生变化(元素出队时,指针会向后移动一位)rear指针保持不动。其操作如下图所示:
对满和队空的条件:
front指针和rear指针初始为-1,每次入队或者出队都会相应的++(自增)
队空:front指针和rear指针相等即为队空(front == rear)
队满:rear指针等于最大空间大小减一 (rear==Maxsize-1)
当rear=MaxSize-1时,队列为满,如果再加入新元素,就会产生“溢出”。但是这种“溢出”并不是真正的溢出,在数组的前端还可能有空位置,所以这是一种假溢出。解决假溢出的方法是使用循环队列。为了能够充分的使用数组中的存储空间,把数组的前端和后端连接起来,形成一个环形的表,即把存储队列元素的表从逻辑上看成一个环,成为循环队列。循环队列的队头和队尾指针进1的公式如下:
队头指针进1:front=(front+1)%MaxSize;
队尾指针进1:rear=(rear+1)%MaxSize;
且使用了循环队列后队空和队满的情况会顺序队列的有所不同。
循环队列中队空的情况
初始化时的队空情况:front=rear=0
循环队列为空的条件是:front==rear
下图为几种循环队列队空的情况:
循环队列队满的情况
循环队列为满的条件是front==(rear+1)%MaxSize。
下图为几种循环队列队满的情况: