✨这里是第七人格的博客。小七,欢迎您的到来~✨
🍅系列专栏:【数据结构和算法】🍅
✈️本篇内容: 队列✈️
🍱本篇收录完整代码地址:数据结构和算法-Java实现🍱
1 队列的定义
队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。说人话就是,队列是一种特殊的链表或者数组,就像排队买票,先来的先买,后来的后买,不允许插队,所以只有最早进入队列的元素才能最先从队列中删除,故队列又称为先进先出(FIFO—first in first out)线性表。如图所示:
2 队列的特点
(1)先进先出。
(2)线性表:链表或者数组。
3 顺序队列
顺序队列是队列的顺序存储结构,通常采用一维数组进行存储,其中连续的存储单元依次存放队列中的元素。进行插入操作的端称为队尾,进行删除操作的端称为队头。
3.1 数据结构逻辑图
3.2 定义队列属性值
3.2.1 逻辑梳理
- 底层结构为数组,所以我们需要定义一个数组来存储数据。
- 往数组里面放数据,我们需要一个大小的属性。
- 定义队头进行删除操作,定义队尾进行插入操作。
3.2.2 代码实现
public class ArrayQueue {
/**
* 数据
*/
private int data[];
/**
* 头
*/
private int head = 0;
/**
* 尾
*/
private int tail = 0;
/**
* 数组的大小,即最大的空间
*/
private int n = 0;
}
3.2 定义判空方法
3.2.1 逻辑梳理
头尾相等,则表示队列为空
3.2.2 代码实现
/**
* 是空
*
* @return boolean
*/
public boolean isEmpty() {
// 头尾相等,那么队列肯定为空
return head == tail;
}
3.3 定义入队方法
3.3.1 逻辑梳理
- 数据入队尾
- 入队后,队尾指针后移
3.3.2 代码实现
/**
* 入队
*
* @param num 值
*/
public void push(int num) {
//判断我们这个队列是不是已经满了
if (tail == n) {
return;
}
// 1、数据入队尾
data[tail] = num;
// 2、入队后,队尾指针后移
tail++;
// 3、以上代码可以简化为 data[tail++] = num
}
3.4 定义出队方法
3.4.1 逻辑梳理
- 将头指针指向下一个,元素,则当前头出队
3.4.2 代码实现
/**
* 出队
*
* @return int
*/
public int pop() {
// 判断空
if (isEmpty()) {
// 这里用-1表示空
return -1;
}
// 将头指针指向下一个,元素,则当前头出队
return data[head++];
}
4 循环队列
循环队列是一种特殊的队列,他首尾相连,每一端都可以进行插入数据和删除数据操作。
4.1 数据结构逻辑图
4.2 定义队列属性值
4.2.1 逻辑梳理
- 底层结构为数组,所以我们需要定义一个数组来存储数据。
- 往数组里面放数据,我们需要一个大小的属性。
- 定义队头进行删除操作,定义队尾进行插入操作。
4.2.2 代码实现
public class ArrayQueue {
/**
* 数据
*/
private int data[];
/**
* 头指针
*/
private int head = 0;
/**
* 尾指针
*/
private int tail = 0;
/**
* 数组的大小,即最大的空间
*/
private int n = 0;
}
4.2 定义判空方法
4.2.1 逻辑梳理
(1)头尾相等,则表示队列为空。
4.2.2 代码实现
/**
* 是空
*
* @return boolean
*/
public boolean isEmpty() {
// 我们这里定义:头尾指向相同,那么队列为空
return head == tail;
}
4.3 定义入队方法
4.3.1 逻辑梳理
- 循环队列规定最多只能有n-1个队列元素,所以当循环队列中只剩下一个空存储单元时,队列就已经满了。翻译成代码就是 (tail + 1) % n == head。
- 数据入队尾。
- 入队后,队尾指针后移。
4.3.2 代码实现
/**
* 入队
*
* @param num 数
*/
public void push(int num){
// 判断队列是否是满的
if((tail + 1) % n == head){
return ;
}
// 1、数据入队尾
data[tail] = num;
// 2、入队尾后,指针后移
tail = (tail + 1) % n;
}
4.4 定义出队方法
4.4.1 逻辑梳理
- 获取头数据,出队列。
- 入队后,队头指针后移。
4.4.2 代码实现
/**
* 出队
*
* @return int
*/
public int pop(){
// 判断队列是否是空的
if(isEmpty()) {
// 表示空
return -1;
}
// 获取头数据,出队列
int m = data[head];
// 头指针向后移
head = (head + 1) % n;
return m;
}
4.4.2 代码实现
/**
* 出队
*
* @return int
*/
public int pop(){
// 判断队列是否是空的
if(isEmpty()) {
// 表示空
return -1;
}
// 获取头数据,出队列
int m = data[head];
// 头指针向后移
head = (head + 1) % n;
return m;
}