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