目录
前言
此文主要是自己学习过程中的记录,如果能帮到大家更好,如有错误望指正
ps:还没写完..
浅聊队列
队列是一种先进先出的线性表
即First Input First Out , 简称:FIFO
简单理解就是去超市买东西结账的时候需要排队,先进队伍的人(先进),先结账出去(先出),后面有其他人想来结账就排在队伍的最末端,等待前面的人结账完成。
例如一台打印机打印东西,先申请打印的就先打印,再想打印什么就排在后面,按顺序依次打印
队列实现
此文代码实现主要使用的是Java语言
同时提供伪代码思路
实现以下三种队列类型:
-
顺序队列
-
循环队列
-
链式队列
主流的队列类型除了以上三种外还有:优先队列...
队列的主要方法
介绍
为了实现队列操作,主要围绕四个方法来进行
IsEmpty():判断队列是否为空
IsFull():判断队列是否已满
Enqueue():进入队列,即从队尾插入一个数据
Dequeue():离开队列,即从队头移除一个数据
[主要方法]实现思路 - 数组
前言
初始化一个长度为N的数组:A[N]
定义两个变量:front、rear
front:用于表示队头的数组下标
rear:用于表示队尾的数组下标
从队列中取出元素就是取自:A[front]
往队列中放入元素就是放至:A[rear+1]
IsEmpty
编写数组队列的时候,初始化的队头(front)和队尾(rear)都为-1
(不用纠结为何为-1,而不是都为0,当作一种约定,都为0说明队列中有且仅有一个元素,在下标0的位置)
因此要判断数组队列是否为空,只需要判断 front = -1 && rear = -1
即可
IsFull
什么情况下数组队列满了呢,如下图
采用循环数组的思想
此时可以明显发现,当rear下标+1的时候,如果与front相等,就代表数组已满。
由于数组长度是固定的,因此需要进行取模运算,即:(rear+1) % QueueSize=front
QueueSize:队列数组长度,上述例子中为7
(rear+1)%QueueSize = (6+1)%7 = 0 = front
此时代表数组队列已满
Enqueue
进入队列,考虑三种情况:
-
数组队列是否已满
if(IsFull(..))
-- 已满将返回对应的信息 例:Queue is full! .. -
数组队列是否为空
if(IsEmpty(..))
-- 为空将front和rear的下标指针都移到0 例:front ← rear ← 0 -
未满未空,遵循队尾进入,如下 👇 即将往下标为0处添加数据 --
rear = (rear + 1) % QueueSize
Dequeue
离开队列,也需要考虑三种情况
-
数组队列是否为空
IsEmpty
-- 为空则无任何数据可以离开队列,返回对应信息 例:Queue is empty ,remove fail -
队头和队尾是否重合
front = rear
-- 当队头和队尾重合的时候,说明队列数组中有且仅有一个元素 👇有且仅有一个元素的时候,执行移除,需初始化front ← rear ← -1
-
不为空且不重合,遵循队头先出 --
front = (front + 1) % QueueSize
👇
「主要方法」实现思路 - 链表
待写..
「Arrays」使用数组实现顺序队列
待写..
「Arrays」使用数组实现循环队列
待写..
「LinkedList」使用链表实现链式队列
待写..