需求:使用环形数组,完成在有限空间内不断取数据不断加数据(模拟银行排队叫号办业务)
主要思路:
1、front是头指针,指向数组的第一个元素,arr[front] 就是队列的第一个元素 ,且他的初始值为0
2、rear是队列的尾指针,指向数组的最后一个位置的前一个元素,留出最后一个位置作为约束,最后一个位置是取不到的
主要算法:
1、判断是否为空:rear == front
2、判断是否为满:(rear+1)% maxSize == front
3、**计算有效数字个数运用size方法:
(rear+maxSize - front)%maxSize
例:rear = 1;front =0;maxSize = 3
package Queue;
import java.util.Scanner;
/**
* 环形数组实现队列
*/
public class CircleArrayQueueDemo {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
CircleArray queue = new CircleArray(4);//其实最多输出三个数,留一个作为约束
char key = ' ';
boolean flag = true;
//定义一个死循环菜单,让其一直做循环
while (flag){
System.out.println("s(show): 显示队列");
System.out.println("e(exit): 退出程序");
System.out.println("a(add): 添加数据到队列");
System.out.println("g(get): 从队列取出数据");
System.out.println("h(head): 查看队列头的数据");
key = sc.next().charAt(0);//获取一个字符
switch (key){
case 's':
queue.showQueue();
break;
case 'a':
System.out.println("请输入一个数:");
int value = sc.nextInt();
queue.addQueue(value);
break;
case 'g' :
try{
int result = queue.getQueue();
System.out.println(result);
}catch (Exception e){
System.out.println(e.getMessage());
}
break;
case 'h':
try{
int res = queue.headQueue();
System.out.println(res);
}catch (Exception e){
System.out.println(e.getMessage());
}
break;
case 'e':
System.out.println("退出菜单");
sc.close();
flag = 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;
front = 0;
rear = 0;
arr = new int[maxSize];
}
//判断队列是否满了
public boolean isFull(){
return (rear+1)%maxSize == front;
}
//判断队列是不是为空
public boolean isEmpty(){
return rear == front;
}
//向队列中添加数据
public void addQueue(int data){
//先判断是不是满了
if(isFull()){
System.out.println("队列已经满了,无法增加数据");
return;
}
//把数据加进去
arr[rear] = data;
rear = (rear+1)%maxSize;
}
//取出队列数据
public int getQueue(){
//判断队列是不是空
if(isEmpty()){
throw new RuntimeException("队列是空的,不能取出数据");
}
int value = arr[front];
front = (front+1)%maxSize;
return value;
}
//显示所有数据
public void showQueue(){
if(isEmpty()){
System.out.println("队列为空,无法显示");
return;
}
//从front开始遍历,一直到有效数字个数结束
for (int i = front; i < front+size(); i++) {
System.out.printf("arr[%d] = %d\n",i%maxSize,arr[i%maxSize]);
}
}
public int size(){
/**
* rear = 1
* front = 0
* maxSize = 3
*/
return (rear+maxSize-front)%maxSize;
}
public int headQueue(){
if(isEmpty()){
throw new RuntimeException("队列为空,无法显示该数据");
}
return arr[front];
}
}