前题回顾
上一篇数组模拟队列我们发现,我们发现队列无法复用,一次性的,为了解决这个问题,我们改变思路
上篇文章链接: 数据结构与算法-数组模拟队列
其中涉及到的一些公式,可以验证它,如果你验证也是没问题的,请记住就OK了,需要动动脑子才想的明白。
思路分析
1.把front的含义做一个调整:front指向队列的第一个元素,也就是arr[front ]为第一个元素,front的初始值为0;
2.rear变量的含义做一个调整:rear指向队列的最后一个元素的后一个位置。希望空成一个空间作为约定,rear的初始值也为0;
3.当队列满时,条件时(rear + 1) % MaxSize = front
4.当队列为空,rear = front
5.队列中有效数据的个数( rear + MaxSize - front ) % MaxSize = 有效个数
代码实现
package com.brilliance.dataStructrues;
import java.util.Scanner;
public class CircleArrayQueueDemo {
public static void main(String[] args) {
//测试数组模拟环形对列
CircleArray circleArray = new CircleArray(4); //队列的最大数据是3,空一个空间出来
char key = ' ';
Scanner scanner = new Scanner(System.in);
boolean loop = true;
while(loop){
System.out.println("s(show): 显示队列");
System.out.println("e(exit): 退出队列");
System.out.println("g(get): 从队列取出数据");
System.out.println("a(add): 向队列插入数据");
System.out.println("h(head): 显示队列头");
key = scanner.next().charAt(0);
switch (key){
case 's':
circleArray.showArray();
break;
case 'a':
System.out.println("输入一个数字");
int value = scanner.nextInt();
circleArray.addQueue(value);
break;
case 'g':
try {
int getValue = circleArray.getQueue();
System.out.println(getValue);
} catch (Exception e) {
System.out.println(e.getMessage());
}
break;
case 'h':
try {
System.out.println("查看队列头的信息");
int headValue = circleArray.headQueue();
System.out.printf("队列头的信息为:%d\n",headValue);
} catch (Exception e) {
System.out.println(e.getMessage());
}
break;
case 'e':
scanner.close();
loop = false;
break;
default:
break;
}
}
System.out.println("程序退出");
}
}
class CircleArray{
private int maxsize;
private int front;
private int rear;
private int[] arr;
public CircleArray(int arrMaxsize){
maxsize = arrMaxsize;
arr = new int[arrMaxsize];
front = 0; //指向队列头部
rear = 0;
}
public boolean isFull(){
return (rear + 1) % maxsize == front;
}
public boolean isEmpty(){
return front == rear;
}
public void addQueue(int n){
if(isFull()){
System.out.println("队列已经满了");
return;
}
arr[rear] = n;
rear = (rear + 1)%maxsize;
}
public int getQueue(){
if(isEmpty()){
throw new RuntimeException("队列已空不能取出数据");
}
int value = arr[front];
front = (front + 1)%maxsize;
return value;
}
public void showArray(){
if(isEmpty()){
System.out.println("队列空,没数据");
return;
}
//从front遍历,遍历到rear就可以
for (int i = front; i < front + size(); i++) {
System.out.printf("arr[%d]=%d\n",i % maxsize,arr[i % maxsize]);
}
}
public int size(){
int value = (rear + maxsize - front)%maxsize;
return value;
}
//显示头元素
public int headQueue(){
if(isEmpty()){
throw new RuntimeException("队列空");
}
return arr[front];
}
}