1. 队列定义
队列属于先进先出型, 队列是一种特殊的线性表,只能在前端(front)进行删除操作,只能在后端(rear)进行删除操作
2. 顺序队列
每次插入,指针rear加一,每次删除,指针front加一
3. 循环队列
初始化时,rear = front=0,当队列不为空时,front指向队列中的第一个元素,rear指向队列中最后一个元素的下一个位置,当队列满时 rear=front,但不一定是位置0
4. 循环序列判空的方法是rear = front;
判满的方法是 (rear+1)%Maxsize ==front;
5. 进队列步骤
(1) 判断队列是否满,即,rear+1是否等于front,若等于则队列已满,不允许进入; (2) 若不满,则将值保存至rear+1的位置 ; 从这里也可以看出,循环数列所能存储的值其实是最大值-1。
6. 队列的链式存储结构
队列的链式存储结构即线性表的单链表,但只能尾进头出,简称链队列。将对头指针指向链队列的头结点,而队尾指针指向终端结点。
7. 队列的链式存储结构的出入队
入队:把拥有元素e新节点s赋值给原队尾结点的后继,把当前的s设置为队尾结点,rear指向;
出队:头结点的后继结点出队,将头结点的后继改为其后面的结点。若链表除头结点外只剩一个元素时,则需将rear指向头结点。
8. 循环队列和链队列的比较
在时间上:基本操作都是常数时间,即都为0(1),不过循环队列是事先申请好空间,使用期间不释放;而对于链队列,每次申请和释放结点也会存在时间开销,若出队入队频繁两者还是有细微区别
在空间上:循环链表必须有一个固定长度,所以就有了存储元素个数和空间浪费的问题;而链队列尽管需要一个指针域,会产生一些空间上的开销,但可以接受,所以链队列更加灵活。
9. 何时用循环队列和链队列
在可以确定队列长度最大值的情况下有循环队列;无法预估队列长度时用链队列。
10. 队列顺序存储的不足
我们假设一个队列有n个元素,则顺序存储的队列需要建立一个大于n的数组,并把队列的所有元素存储在数组的前n个单元,数组下标为0的一端即是队头。所谓的入队列操作,其实就是在队尾追加一个元素,不需要移动任何元素,因此时间复杂度为O(1)。与栈不同的是:队列元素的出列是在队头,即下标为0的位置,意味着一个元素出队后,队列中的其他所有元素都得向前移动,以保证队列的队头,也就是下标为0的位置不为空,该时间复杂度为O(n)。在现实中也是如此,一群人排队买票,前面的人买好了离开,后面的人就要全部向前一步,补上空位。如果不去限制队列的元素必须存储在数组的前n个单元的这一条件,出队的性能就会大大增加。也就是说,队头不需要一定在下标为0的位置。为了避免当只有一个元素时,队头和队尾重合使处理变得麻烦,所以引入两个指针,front指针指向队头元素,rear指针指向队尾元素的下一个位置,这样当front==rear时,此队列不是还剩一个元素,而是空队列。