数组模拟环形(循环)队列(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("程序退出"); } }
循环队列的取模还是挺难理解的,我先放一放,等我完全搞清楚了,我再来更新这篇博文,并附上更详细的讲解。