数组模拟环形(循环)队列(Java语言实现)
紧接着上一个内容,使用循环队列可以让数组模拟的单向队列复用,这样提高了程序的效率。
循环队列:
代码实现循环队列类:
RepeatQueue.java
package cn.Day02.demo2;
public class RepeatQueue {
private int maxSize;//队列的最大长度
private int front;//队头指针,指向队列的头元素
private int rear;//队尾指针,指向队列的尾元素的后一个位置
private int[] arr;//用于存放队列元素的数组
public RepeatQueue(int size){
arr=new int[size];
maxSize=size;
front=0;
rear=0;
}
/**
* 获取队列中元素的个数,即队列的长度
*/
public int RepeatQueueLength(){
return (rear-front+maxSize)%maxSize;
}
/**
* 判断队列是否满
* (rear+1)%MaxSize==front
*/
public boolean isFull(){
return ((this.rear+1)%this.maxSize)==this.front;
}
/**
*判断队列是否为空
*/
public boolean isEmpty(){
return this.front==this.rear;
}
/**
* 添加数据到队列
*/
public void addQueue(int element){
if (isFull()){
System.out.println("队列满,不能加入数据~");
return;
}
arr[rear]=element;
rear=(rear+1)%maxSize;
}
/**
* 取出数据
*/
public int getQueue(){
if (isEmpty()){
throw new RuntimeException("队列空,不能取数据");
}
int res=arr[front];
front=(front+1)%maxSize;
return res;
}
/**
* 获取队列中有效数据的个数
*/
public int QueueLength(){
return (rear-front+maxSize)%maxSize;
}
/**
* 打印队列
*/
public void showQueue(){
if (isEmpty()){
System.out.println("队列为空");
}
for (int i=front;i<front+RepeatQueueLength();i++){
System.out.printf("arr[%d]:%d",i%maxSize,arr[i%maxSize]);//注意要取模
}
}
}
测试类
RepeatQueueDemo.java
package cn.Day02.demo2;
import java.util.Scanner;
public class RepeatQueueDemo {
public static void main(String[] args) {
//1.创建一个队列
RepeatQueue arrayQueue=new RepeatQueue(4);//有效长度为3
char key=' ';//获取用户输入
Scanner input=new Scanner(System.in);
boolean loop=true;
//输出一个菜单
while (loop){
System.out.println("s(show):显示队列");
System.out.println("e(exit):退出程序");
System.out.println("a(add):添加数据");
System.out.println("g(get):从队列取出数据");
System.out.println("L(length):获取队列的有效长度");
key=input.next().charAt(0);//读取一个字符
switch (key){
case 's':
arrayQueue.showQueue();
break;
case 'a':
System.out.println("请输入一个数");
int value=input.nextInt();
arrayQueue.addQueue(value);
break;
case 'g':
try{
int res=arrayQueue.getQueue();
System.out.printf("取出的数据是%d\n",res);
}catch (Exception e){
System.out.println(e.getMessage());
}
break;
case 'e':
input.close();
loop=false;
break;
default:
break;
}
}
System.out.println("程序退出");
}
}
循环队列的取模还是挺难理解的,我先放一放,等我完全搞清楚了,我再来更新这篇博文,并附上更详细的讲解。
——2019.8.30