数组模拟环形队列
import java.util.Scanner;
/**
* @author carry_C
* @date 2020/5/22 - 13:50
*/
public class CircleArrayQueueDemoTest {
public static void main(String[] args) {
//测试
CircleArrayTest queue = new CircleArrayTest(4);//虽然maxsize为4,但是有效数据只有3
Scanner scanner = new Scanner(System.in);
char key = ' ';
int data;
int data1;
boolean loop = true;
while(loop){
System.out.println("\n请选择你要执行的操作");
System.out.println("字母a为增加元素");
System.out.println("字母f为展示front所在元素值");
System.out.println("字母g为获取元素值");
System.out.println("字母s为展示当前环形队列所有元素值");
System.out.println("字母e为退出程序");
key = scanner.next().charAt(0);
switch (key){
case 'a':
System.out.println("请输入你想要添加的元素");
data = scanner.nextInt();
queue.add(data);
break;
case 'f':
queue.showFront();
break;
case 'g':
data1 = queue.get();
System.out.printf("取出的元素为:%d",data1);
break;
case 's':
queue.showQueue();
break;
case 'e':
loop = false;
break;
}
}
System.out.println("程序已退出");
}
}
class CircleArrayTest{
private int front;//front指向队列第一个元素
private int rear;//rear指向的是队列最后一个元素的后一个位置
private int maxsize;//虽然是maxsize,但是队列中可用空间只有maxsize-1,因为rear指向改变
public int array[];//数组模拟环形队列
public CircleArrayTest(int maxSize){
maxsize = maxSize;
array = new int[maxsize];//创建数组模拟环形队列
front = 0;
rear = 0;
}
//判断队列是否为空
public boolean isEmpty(){
return front==rear;
}
//判断队列是否为满
public boolean isFull(){
return (rear+1)%maxsize==front;
}
//向环形队列中添加元素
public void add(int ele){
//首先判断环形队列是否满
if (isFull()){
System.out.println("当前环形队列已满,不能添加数据");
return;
}else{
array[rear] = ele;
rear = (rear+1)%maxsize;
System.out.println("添加成功");
}
}
//展示当前环形队列的第一个元素
public void showFront(){
//判断当前环形队列是否为空
if (isEmpty()){
throw new RuntimeException("当前环形队列为空,无法查询数据");
}else {
System.out.printf("当前环形队列front所在位置的数据值为:%d",array[front]);
}
}
//取出环形队列中的数据
public int get(){
int temp;
//判断当前环形队列是否为空
if (isEmpty()){
throw new RuntimeException("当前环形队列为空,无法取出数据");
}else{
temp = array[front%maxsize];
front = (front+1)%maxsize;
return temp;
}
}
//展示当前环形队列中所具有的元素
public void showQueue(){
//判断当前环形队列是否为空
if (rear==front){
System.out.println("当前环形队列为空,不能遍历输出");
}else{
for (int i = front; i < front+size(); i++) {
System.out.printf("arr[%d] = %d\t",i%maxsize,array[i%maxsize]);
}
}
}
//获取当前环形队列所具有的有效数据的个数
public int size(){
return (rear+maxsize-front)%maxsize;
}
}
注意:
1. front指向的是环形队列的第一个元素 rear指向的是环形队列的最后一个元素的后一个位置
2. 当前队列有效数据个数(已经使用的空间):(rear+maxsize-front)%maxsize
3. 判断环形队列是否为空的条件:rear == front
4. 判断环形队列是否为满的条件:(rear+1)%maxsize == front
5. 虽然构造器中设置maxsize,但是实际可用空间为maxsize-1(要预留一个位置给rear做判断,也就是rear指向的是环形队列的最后一个元素的后一个位置)
6. 获取元素方法get()中front对maxsize取模的原因是为了让下标循环