一:数组模拟环形队列
- 解决思路,为了解决循环的问题,我们可以通过取模的方式来解决,同时空出数组的最后一个位置来作为rear再向下一步就要走到first的标识,如数组的大小为3,则实际队列可以存储的数据大小为2.
- 尾索引的下一个为头索引时表示队列满,即将队列容量空出一个作为约定,这个在做判断队列满的时候需要注意 (rear + 1) % maxSize == front 满]
- rear == front [空]
- 分析示意图:
二:代码实现
ArrayCircleQueue实体类
package com.circlequeue;
/**
* @author lizhangyu
* @date 2021/3/8 19:54
*/
public class ArrayCircleQueue {
private int size;
private int first;
private int rear;
private int[] arr;
public ArrayCircleQueue(int size) {
this.size = size;
this.arr = new int[size];
}
/**
* 判断队列是否已经满了
* @return
*/
public boolean isFull() {
return (rear + 1) % size == first;
}
/**
* 判断队列是否为空
* @return
*/
public boolean isEmpty() {
return rear == first;
}
public void addQueue(int n) {
if (isFull()) {
System.out.println("队列已经满了,不能加入数据了");
return;
}
arr[rear] = n;
rear = (rear + 1) % size;
}
/**
* 获取队列首个数据并出队列
* @return
*/
public int getQueue() {
if (isEmpty()) {
System.out.println("队列为空");
}
int value = arr[first];
first = (first + 1) % size;
return value;
}
/**
* 获取队列首个数据但是不出队列
* @return
*/
public int headQueue() {
if (isEmpty()) {
System.out.println("队列为空");
}
return arr[first];
}
/**
* 显示队列数据
*/
public void showQueue() {
if (isEmpty()) {
System.out.println("队列为空");
return;
}
for (int i = first; i < first + size(); i++) {
System.out.println("队列第" + (i + 1) + "个数据为:" + arr[i]);
}
}
/**
* 队列中的有效数据
* @return
*/
public int size() {
return (rear - first) % size;
}
}
ArrayCircleQueueDemo实体类
package com.circlequeue;
import java.util.Scanner;
/**
* @author lizhangyu
* @date 2021/3/8 20:09
*/
public class ArrayCircleQueueDemo {
public static void main(String[] args) {
ArrayCircleQueue arrayCircleQueue = new ArrayCircleQueue(3);
String key = "";
Scanner scanner = new Scanner(System.in);
while (true) {
System.out.println("show: 显示队列");
System.out.println("add: 添加数据到队列");
System.out.println("get: 从队列中取出数据");
System.out.println("find: 查看队列头的数据");
System.out.println("exit: 退出系统");
key = scanner.next();
switch (key) {
case "add" :
System.out.println("请输入一个数");
int n = scanner.nextInt();
arrayCircleQueue.addQueue(n);
break;
case "find" :
int res = arrayCircleQueue.headQueue();
System.out.println("从队列中取出数据为:" + res);
break;
case "get" :
res = arrayCircleQueue.getQueue();
System.out.println("从队列中取出数据为:" + res);
break;
case "show" :
arrayCircleQueue.showQueue();
break;
case "exit" :
scanner.close();
System.exit(0);
default:
break;
}
}
}
}
测试结果:
show: 显示队列
add: 添加数据到队列
get: 从队列中取出数据
find: 查看队列头的数据
exit: 退出系统
add
请输入一个数
1
show: 显示队列
add: 添加数据到队列
get: 从队列中取出数据
find: 查看队列头的数据
exit: 退出系统
add
请输入一个数
2
show: 显示队列
add: 添加数据到队列
get: 从队列中取出数据
find: 查看队列头的数据
exit: 退出系统
add
3
请输入一个数
队列已经满了,不能加入数据了
show: 显示队列
add: 添加数据到队列
get: 从队列中取出数据
find: 查看队列头的数据
exit: 退出系统
show
队列第1个数据为:1
队列第2个数据为:2
show: 显示队列
add: 添加数据到队列
get: 从队列中取出数据
find: 查看队列头的数据
exit: 退出系统
get
从队列中取出数据为:1
show: 显示队列
add: 添加数据到队列
get: 从队列中取出数据
find: 查看队列头的数据
exit: 退出系统
find
从队列中取出数据为:2
show: 显示队列
add: 添加数据到队列
get: 从队列中取出数据
find: 查看队列头的数据
exit: 退出系统
show
队列第2个数据为:2
show: 显示队列
add: 添加数据到队列
get: 从队列中取出数据
find: 查看队列头的数据
exit: 退出系统