一.队列的基本概念
队列是另一种特殊的表,这种表只在表首(也称为队首)进行删除操作,只在表尾进行插入操作。
队列的修改是按先进先出的规则进行的,所以队列又称为先进先出表,First In First Out,简称FIFO表。映射到生活中就是排队的队伍。
如示意图所示,a(1)就是队首元素,a(n)就是队尾元素。队列中的元素是按顺序进入的,退出队列也只能按照这个次序一次退出。
特点:队首删除快,队尾插入快,适用于在队首频繁删除,在队尾频繁插入的场景。
二.队列的基本运算
1.QueueEmpty(Q):测试队列Q是否为空
2.QueueFull(Q):测试队列Q是否已满
3.QueueFirst(Q):返回队列Q的队首元素
4.QueueLast(Q):返回队列Q的队尾元素
5.EnterQueue(x,Q):在队列的Q的队尾插入元素x
6.DeleteQueue(Q):闪出并返回队列Q的队首元素
三.队列的实现
1.用指针实现队列--链式队列(简称链队)
队尾(rear)——指向插入端的指针
队头(front)——指向删除端的指针
2.用循环数组实现队列--循环队列
【1】先考虑用普通数组实现队列会遇到的问题--假溢出
什么是假溢出呢?
系统作为队列用的存储区还没有满,但队列却发生了溢出,我们把这种现象称为“假溢出”。
使用普通队列实现为什么会出现假溢出?
简单说根本原因就是删除元素后front指针会向上移动,导致front下面的空间无法再利用。
【2】解决方法--循环数组实现循环队列
简单说就是rear/front到M-1时再插入/删除元素就会返回0从头开始。这是循环队列和顺序队列的主要差别。
【3】循环队列队空队满判定优化
循环队列和顺序队列一样还有一个不完美的地方。就是队空和队满的判定条件都是front==rear,这就无法判断队空还是队满状态。
解决方案:
1.另外设一个标志以区别队空、队满
2.少用一个元素空间