参考blibli上面的视频和笔记进行的整理,相关视频链接:
https://www.bilibili.com/video/BV1B4411H76f
https://www.bilibili.com/video/BV1iJ411E7xW
一、队列简介
1、队列的应用场景:
银行叫号、餐厅排队…
2、队列介绍
- 队列是一个有序列表,可以用数组或链表来实现(用数组来实现:顺序存储;用链表来实现,就是链式存储)
- 遵循先入先出(FIFO) 的原则,即:先存入队列的数据,要先取出,后存入的要后取出
二、数组模拟队列
2.1数组模拟队列思路
maxSize:该队列的最大容量
初始化:rear=front=-1
front = -1;// 指向队列头部,分析出front是指向队列头的前一个位置
rear = -1;//指向队列尾,指向队列尾的数据(即就是队列最后一个数据)
数据加入:rear++; front无变化 (数据的输入是在尾部进行的,rear会随着数据的加入而改变)
数据取出:front++ ; rear无变化(数据的取出是在队头进行的,front会随着数据的取出而改变)
当 rear == maxSize-1 时,队列满
当 front == rear 时,队列空
2.2代码实现
使用数组模拟队列,编写一个ArrayQueue类
包括以下功能:
- 创建队列构造器
- 判断队列是否满
- 判断队列是否空
- 添加数据到队列
- 获取队列的数据,出队列
- 显示队列的所有数据
- 显示队列的头数据
//使用数组模拟队列- 编写一个ArrayQueue类
class ArrayQueue {
private int maxSize;// 表示数组的最大容量
private int front;// 队列头
private int rear;// 队列尾
private int[] arr;// 该数据用于存放数据,模拟队列
//创建队列的构造器,即给队列初始化
public ArrayQueue(int arrMaxSize){
maxSize = arrMaxSize;// 数组的最大容量
arr = new int[maxSize]; //根据指定的最大容量创建数组
front = -1;// 指向队列头部,分析出front是指向队列头的前一个位置
rear = -1;//指向队列尾,指向队列尾的数据(即就是队列最后一个数据)
}
//判断队列是否满
public boolean isFull(){
return rear == maxSize-1; //如果rear指向最后一个元素了,即满了。队列的最大长度为maxSize,数组下标从0开始,所以最后一个元素为maxSize-1
}
//判断队列是否为空
public boolean isEmpty(){
return rear == front;
}
//添加数据到队列
public void addQueue(int n){
//判断队列是否满
if(isFull()){
System.out.println("队列满了,不能加入数据");
return;
}
rear++; //让rear后移
arr[rear] = n; //这两步也可以写为arr[++rear] = n;
}
//获取队列的数据,出队列
public int getQueue(){
//判断队列是否为空
if(isEmpty()){
//如果队列为空,那么通过抛出异常来处理
throw new RuntimeException("队列空,不能取数据");
}
front++; //front后移
return arr[front];
}
//显示队列的所有数据
public void showQueue(){
//遍历
if(isEmpty()){
System.out.println("队列空的,没有数据");
return;
}
for(int i = 0; i < arr.length; i++){
System.out.printf("arr[%d]=%d\n",i,arr[i]);
}
}
//显示队列的头数据,注意不是取出数据
public int headQueue(){
//判断是否为空
if(isEmpty()){
throw new RuntimeException("队列空的,没有数据...");
}
return arr[front+1]; //因为front是指向队列头的前一个位置,所以返回arr[front+1]
}
}
测试方法:
public class ArrayQueueDemo{
public static void main(String[] args){
//创建一个队列
ArrayQueue queue = new ArrayQueue(3)