四、队列
队列:具有一定操作约束的线性表
插入和删除操作:只能在一端插入,而在另一端删除,即在一端入队,在另一端出队
数据插入:入队
数据删除:出队
特点:先进先出
队列的抽象数据类型描述
队列的存储
一、队列的顺序存储实现
队列的顺序存储结构通常由一个一位数组和一个记录队列头元素位置的变量front以及一个记录队列尾元素的变量rear组成,front指向第一个元素的前面一个位置,rear指向队列最后一个元素的位置,从front出队,从rear入队,通过判断front和rear的相对位置判断队列的元素个数
(1)声明
循环队列
当队列最后一个位置有元素而队列不满时,无法再从尾部入队,所以再从头部入队,形成循环队列
当形成循环队列时,无法只用相对位置法判断队列空满,原因如下:
一个长度为n的队列,队列状态有n+1种,而front和rear的相对距离只有n种情况
解决方法
1.额外标记法:使用Size域保存队列中元素的个数,判断size是否为0,或使用tag域即0或1表示最后一次出入队操作,如插入时tag为1,删除时tag为0,在front和rear相对位置为0时,若tag为1,则队列为满,反之则为空
2.仅使用n-1个数组空间,将front所在位置空出
使用方法2进行操作
(1)入队:首先要判断队列是否已满,判断方法:(rear+1)%MaxSize==front
(2)出队:首先要判断队列是否为空,判断方法:front==rear
二、队列的链式存储实现
队列的链式存储结构也可以用一个单链表实现,插入和删除操作分别在链表的两头进行,只能在链表头进行删除,front只能放在链表的头部
(1)声明:两个结构,一个是指针结构,另外一个是链表主体,也可以使用两个操作指针代替指针结构
(2)入队:实质上是链表的插入尾接法
(3)出队:首先要判断链表是否为空,链表结构如所示
判断是否为空,即判断front是否指向NULL
若删除后队列为空,则要将front和rear都指向NULL
FrontCell表示第一个节点,FrontElem用于存储第一个节点的数据