队列(queue):只允许在一端进行插入操作,而在另一端进行删除操作的线性表 先进先出结构(first in first out)FIFO插入的一端称为队尾 删除的一端称为队头
两种存储方式:顺序存储 链式存储
顺序存储
方式1:入队列O(1) 出队列是O(n)的时间复杂度
方式2:另一种考虑出队列的方式:不用全部移动所有元素,也即是队头不一定在下标为0的位置
其中两个指针分别指向队头(front)和队尾(rear)
队列为空的判断条件是:front=rear
方式2的的缺点是会出现“假溢出”,也即是rear指针指向未知的地址,而实际上数组的前半部分还有空闲空间
为此引出方式3:循环队列(把队列的头尾相接)
问题是:队列满时指针front=rear,如何区别队列为空的判断条件front==rear?
方法1:设置标志区分
方法2:队列满时故意保留一个元素空间
队列满的判断条件是:(rear+1)%QueueSize==front
其中取余队列最大长度QueueSize的原因是rear可能在front的后面,也可能差了一整整圈
队列的长度:(QueueSize-front+rear)%QueueSize
循环队列的缺点:数组长度是固定的
初始化:
入队列操作:
出队列操作:
链式存储结构
也称为链队列
空队列:
入队操作:
链表的尾插,参考文章:线性表----顺序存储、单链表、静态链表https://blog.csdn.net/heda3/article/details/81437052
出队操作:
需要一个判断是否是空队列
特殊情况:只有一个结点时,出队列,那么最后只剩下头结点 ;为此指针front=rear
适用情况: 确定队列长度最大值时,循环队列较合适;无法预估队列长度,则链队列较合适。
参考:大话数据结构