队列
大家好呀,我是小笙,这个系列主要记录我学习算法与数据结构的笔记
是先进先出(FIFO, First-In-First-Out)的线性表。在具体应用中通常用链表或者数组来实现。队列只允许在后端(称为rear)进行插入操作,在前端(称为front)进行删除操作
主函数实现调用
public static void main(String[] args) {
// 按键输入
Scanner sc = new Scanner(System.in);
System.out.print("请输入队列的长度:");
int num = sc.nextInt();
ArrQueue arr = new ArrQueue(num);
while(true){
System.out.println("模拟队列");
System.out.println("1.添加数据,入栈");
System.out.println("2.获取数据,出栈");
System.out.println("3.显示数据");
System.out.println("4.显示头数据,不出栈");
System.out.print("请输入你的选择选择(1~4):");
num = sc.nextInt();
int addNum;
switch (num){
case 1: System.out.print("请输入添加的数字数据:");
addNum = sc.nextInt();
arr.addQueue(addNum);
break;
case 2: System.out.println(arr.getQueueData());
break;
case 3: arr.showArrQueue();
break;
case 4: arr.headQueue();
break;
default:
System.out.println("请你重新输入");
}
}
}
创建类 实现队列创建,出栈,入栈等等
class ArrQueue {
/**
* 队列
* 先入先出原则
* 目前问题:
* 1)目前的数组使用一次就不能用了,没有达到复用的效果
* 2)将这个数组使用算法,改进成一个环形的算法 取模%
*/
private int maxsize; // 表示数组的最大容量
private int front; // 队列头
private int rear; // 队列尾
private int[] arr; // 该数据用于存放数据,模拟队列
// 创建队列的构造器
public ArrQueue(int arrMaxSize) {
maxsize = arrMaxSize;
arr = new int[maxsize];
front = -1; // 指向队列头部
rear = -1; // 指向队列尾部
}
// 判断队列是否满
public boolean isFull() {
return rear == maxsize - 1;
}
// 判断队列是否为空
public boolean isEmpty() {
return rear == front;
}
// 添加数据到队列 入队列
public void addQueue(int num) {
// 判断队列是否为满
if (isFull()) {
System.out.println("队列满,不能加入数据!");
return;
}
rear++;
arr[rear] = num; // 向数组中插入num这个数
}
// 获取队列的数据 出队列
public int getQueueData() {
// 判断是否为空队列
if (isEmpty()) {
// 通过抛出异常
throw new RuntimeException("队列为空,无法显示数据!");
} else {
front++;
return arr[front];
}
}
// 显示队列的所有数据
public void showArrQueue() {
// 判断是否为空队列
if (isEmpty()) {
System.out.println("队列为空,无法显示数据!");
return;
}
for (int i = front; i <= rear-1; i++) {
System.out.println(arr[i+1] + "\t");
}
}
// 显示头数据不取出
public void headQueue() {
// 判断是否为空
if (isEmpty()) {
System.out.println("队列为空,无法显示数据!");
return;
}
System.out.println("头数据为" + arr[front + 1]);
}
}
/*
* 写到这里,想必大家一定会有疑问,为啥front 和 rear 都是初始值为-1呢?
* 其实初始值为0也是可以的,只不过代码逻辑会发生微小的变化
* 原本当初始值为-1的时候,入队列的步骤:1.rear++ 2.向数组中插入num这个数
* 如果改成初始值为0的时候,入队列的步骤:1.向数组中插入num这个数 2.rear++
* 但是注意:这个初始化为-1仅局限于非循环队列
*/
为实现复用的效果 将原来的队列升级为循环队列
class Circle {
private int maxsize; // 表示数组的最大容量
private int front; // 队列头
private int rear; // 队列尾
private int[] arr; // 该数据用于存放数据,模拟队列
// 创建队列的构造器
public Circle(int arrMaxSize) {
maxsize = arrMaxSize;
arr = new int[maxsize];
front = 0; // front就指向队列的第一个元素
rear = 0; // rear指向队列最后一个元素的后一个位置
}
// 判断队列是否满
public boolean isFull() {
return (rear+1)%maxsize == front%maxsize;
}
// 判断队列是否为空
public boolean isEmpty() {
return rear == front;
}
// 添加数据到队列 入栈
public void addQueue(int num) {
// 判断队列是否为满
if (isFull()) {
System.out.println("队列满,不能加入数据!");
return;
}
arr[rear] = num; // 向数组中插入num这个数
rear = (rear+1)%maxsize;
}
// 获取队列的数据 出栈
public int getQueueData() {
// 判断是否为空队列
if (isEmpty()) {
// 通过抛出异常
throw new RuntimeException("队列为空,无法显示数据!");
} else {
int value =arr[front];
front = (front+1)% maxsize;
return value;
}
}
// 显示队列的所有数据
public void showArrQueue() {
// 判断是否为空队列
if (isEmpty()) {
System.out.println("队列为空,无法显示数据!");
return;
}
// 思路:从front开始,遍历多少个元素
for (int i = front; i < front+(rear+maxsize-front)% maxsize; i++) {
System.out.println(arr[i%maxsize] + "\t");
}
}
// 显示头数据不取出
public void headQueue() {
// 判断是否为空
if (isEmpty()) {
System.out.println("队列为空,无法显示数据!");
return;
}
System.out.println("头数据为" + arr[front]);
}
}