数组实现循环队列
front:头元素的下标,初始值为0
rear:尾元素后一位置的下标,初始值为0
判断为空的条件: rear == front
判断为满的条件: (rear + 1) % maxsize == fron
添加元素后: rear = (rear + 1) % maxsize
取出元素后: front = (front + 1) % maxsize
队列的有效值个数: (rear + maxsize - front) % maxsize
这样的队列会空出一个位置
将数据带入上面的公式理解就好
代码实现
import java.util.Scanner;
/**
* @author Watching
* * @date 2022/10/24
* * Describe:数组实现循环队列
* front:头元素的下标,初始值为0
* rear:尾元素后一位置的下标,初始值为0
* 队列的有效值个数: (rear + maxsize - front) % maxSize
* 判断为空的条件: rear == front
* 判断为满的条件: (rear + 1) % maxsize == front
* 添加元素后: rear = (rear + 1) % maxsize
* 取出元素后: front = (front + 1) % maxsize
*
*/
public class ArrayQueuePro {
private int front;
private int rear;
private int maxsize;
private int[] queue;
//构造器初始化队列
public ArrayQueuePro(int maxsize) {
this.maxsize = maxsize;
front = 0;
rear = 0;
queue = new int[maxsize];
}
//判断是否为空
public boolean isEmpty() {
if (front == rear) {
return true;
}
return false;
}
//判断是否为满
public boolean isFull() {
if ((rear + 1) % maxsize == front) {
return true;
}
return false;
}
//添加元素
public void add(int value) {
//判断是否为满
if (isFull()) {
System.out.println("队列已满");
return;
}
queue[rear] = value;
//取出头元素,rear要++,但是到数组末尾时再++就会数组越界,所以需要取模
rear = (rear + 1) % maxsize;
}
//取出头元素
public int getFront() {
//判断是否为空
if (front == rear) {
throw new RuntimeException("队列为空");
}
int val = queue[front];
//取出头元素,front要++,但是到数组末尾时再++就会数组越界,所以需要取模
front = (front + 1) % maxsize;
return val;
}
//打印队列
public void printAll() {
for (int i : queue) {
System.out.println(i);
}
}
//展示头元素
public void showFront() {
System.out.println(queue[front]);
}
public static void main(String[] args) {
ArrayQueuePro arrayQueue = new ArrayQueuePro(4);
Scanner scanner = new Scanner(System.in);
char flag;
boolean flag1 = true;
while (flag1) {
System.out.println("s(show):显示队列");
System.out.println("e(exit):退出程序");
System.out.println("a(add):添加数据");
System.out.println("g(get):获取数据");
System.out.println("f(showFront):展示头元素");
System.out.print("请选择功能:");
flag = scanner.next().charAt(0);
switch (flag) {
case 's':
arrayQueue.printAll();
break;
case 'e':
System.out.println("正在退出...");
scanner.close();//关闭键盘流
flag1 = false;
break;
case 'a':
System.out.print("请输入需要添加的数据:");
int value = scanner.nextInt();
arrayQueue.add(value);
break;
case 'g':
try {
System.out.println("取出数据:" + arrayQueue.getFront());
break;
} catch (Exception e) {
System.out.println(e.getMessage());
}
case 'f':
arrayQueue.showFront();
break;
default:
System.out.println("输入错误,请重新输入");
break;
}
}
}
}