队列 是 先进先出( FIFO,First In, First Out) 的线性表。在具体应用中通常用链表或者数组来实现,用数组实现的队列叫作 顺序队列 ,用链表实现的队列叫作 链式队列 。
-
队列的操作在两端进行,即 在后端(rear)进行插入操作也就是 入队 enqueue,在前端(front)进行删除操作也就是出队 dequeue
-
在队列中,删除的数据还保留着内存中,但头指针已不再指向它
-
队列和栈一样,存在上溢和下溢。此外,还存在”假溢出“现象
队列的分类
为了方便起见,约定:初始化建空队时,令front=rear=0,当队空时:
front=rear
当队满时:front=rear 亦成立
单队列
单队列又分为顺序队列(数组实现)和链式队列(链表实现)。单队列从前面删除元素,从后面插入元素,类似于现实中的排队(只是不允许插队🤣)。
顺序队列
队列的顺序存储结构,又称为顺序队列,顺序队列实际上是运算受限的顺序表。
在顺序队列,由于数组分配的存储空间存在边界,头尾指针不断增加而不减小(或只减小而不增加),被删除元素的存储空间不能重新利用,会发生”假溢出“,即明明有位置却不能添加元素。
解决假溢出的方法有许多种,如:设定队首指针不动,只要插入元素,在队列的末尾直接插入;只要删除元素,从队首的位置直接删除就行了,但这样会造成大量的数据元素移动。一种更好的办法是,将队列循环起来,也就是循环队列。
链式队列
链式队列,使用带头指针front和尾指针rear的单链表实现。一般用单向链表来实现,不采用循环双链表或者双链表主要是双链表的空间开销(空间复杂度,多前继指针)相对单链表来说大了不少,而单链表只要新增头指针和尾指针就可以轻松实现常数时间内(时间复杂度为O(1))访问头尾结点。
Java实现链式队列的其中一种方法:
class linkqueue{
private link front;