队列介绍
- 队列是一个有序列表,可以用数组或是链表来实现
- 遵循先进先出
- 数组不做处理,只能使用一次,不能复用
- 可以使用LinkedList来模拟队列 linkedlist.addLast()和 linkedlist.removeFirst()
循环队列思路:
- front变量的含义做一个调整:front指向队列的第一个元素,初始值为0
- rear变量是指向队列的最后一个元素的后一个位置,因为希望空出一个空间作为约定
- 当队列满时,条件时(rear+1)%maxSize == front
- 当队列空时,rear==front
- 队列中有效的数据个数rear+maxSize-front)%maxSize
public class CircleArrayQueue {
public static void main(String[] args) {
CircleQueue queue = new CircleQueue(4);
Scanner scan = new Scanner(System.in);
boolean loop = true;
while (loop) {
System.out.println("菜单:");
System.out.println("输入 a 往队列添加数据");
System.out.println("输入 g 获取队列数据");
System.out.println("输入 s 显示队列数据");
System.out.println("输入 h 显示头数据");
String str = scan.nextLine();
char charAt = str.charAt(0);
switch (charAt) {
case 'a':
System.out.println("输入数据:");
Scanner scanner = new Scanner(System.in);
queue.addQueue(scanner.nextInt());
break;
case 'g':
int queue1 = queue.getQueue();
System.out.println("取出的数据为" + queue1);
break;
case 's':
queue.showQueue();
break;
case 'h':
queue.headQueue();
break;
default:
System.out.println("错误操作~~");
loop = false;
}
}
}
}
/**
* 在总数组中预留一个
* 循环队列思路:
* - front变量的含义做一个调整:front指向队列的第一个元素,初始值为0
* - rear变量是指向队列的最后一个元素的后一个位置,因为希望空出一个空间作为约定
* - 当队列满时,条件时(rear+1)%maxSize == front
* - 当队列空时,rear==front
* - 队列中有效的数据个数(rear+maxSize-front)%maxSize
*/
class CircleQueue {
private int front;//头指针 指向数组的第一个元素
private int rear;//尾指针 指向数组最后一个元素的后一个位置
private int[] arr;
private int maxSize;//最大数组值
public CircleQueue(int maxSize) {
this.maxSize = maxSize;
arr = new int[maxSize];
}
public boolean isFull() {
return (rear + 1) % maxSize == front ;
}
public boolean isEmpty() {
return front == rear;
}
public void addQueue(int num) {
if (isFull()) {
throw new RuntimeException("队列已满");
}
System.out.println("尾指针:"+rear+",数据:"+num);
arr[rear] = num;
rear = (rear + 1) % maxSize;
}
public int getQueue() {
if (isEmpty()) {
throw new RuntimeException("队列空");
}
int temp = front;
front = (front + 1) % maxSize;
return arr[temp];
}
//显示队列
public void showQueue() {
int length = (rear + maxSize - front) % maxSize; //数据个数
for (int i = front; i < front + length; i++) {
System.out.printf("arr[%d]=%d\n",i % maxSize, arr[i % maxSize]);
}
}
//显示队列的头数据
public void headQueue() {
if(isEmpty()){
throw new RuntimeException("队列为空了,不能在移除~");
}
System.out.println(arr[front]);
}
}