1.为什么要用环形队列?
2.数组模拟环形队列
3.代码实现
package com.queue; import java.util.Scanner; /** * 数组模拟环形队列 * @author nidegui * @create 2019-10-24 11:33 */ public class CircleQueue { public static void main(String[] args) { System.out.println("测试环形队列的案列"); CircleArry circleArry=new CircleArry(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("a(add):添加数据"); System.out.println("g(get):得到数据"); System.out.println("h(head):查看头数据"); key = scanner.next().charAt(0); switch (key){ case 's': circleArry.showData(); break; case 'a': System.out.println("输入一个数"); int next = scanner.nextInt(); circleArry.addQueue(next); break; case 'g': int queues = circleArry.getQueue(); System.out.printf("取出的数据是%d\n",queues); break; case 'h': int i = circleArry.headQueue(); System.out.printf("取出的数据是%d\n",i); break; case 'e': scanner.close(); loop=false; break; default: break; } } System.out.println("程序退出"); } } class CircleArry{ private int maxSize; //表示数组的最大容量 //front:变量的含义做一个调整,front指针指向第一个元素,也就是说 arr[front]就是队列的第一个元素 //front的初始值是0 private int front; //对头 private int rear; //队尾 private int arr[]; //建立构造器 public CircleArry(int arrMaxSize){ maxSize=arrMaxSize; // arr=new int[maxSize]; } //判断队列是否满 public boolean isFull(){ return (rear+1)%maxSize==front; } //判断队列是否是空 public boolean isEmpty(){ return rear==front; } //向队列中添加数据 public void addQueue(int n){ //判断队列是否堆满 if(isFull()){ System.out.println("队列满,不能添加数据"); return; } //直接将数据加入 arr[rear]=n; rear=(rear+1)%maxSize; //rear向后移动,这里必须考虑取模 } //获取队列数据,出数据 public int getQueue(){ //判断队列是否是空 if(isEmpty()){ //通过抛出异常 throw new RuntimeException("队列空,不能取出数据"); } //这里需要分析出front是指向队列的第一个元素 // 1.先把front的值保存到一个临时变量 // 2.将front后移,考虑取模 // 3.将临时变量的值取回 int value=arr[front]; front=(front+1)%maxSize; return value; } //显示队列所有数据 public void showData(){ //遍历 if(isEmpty()){ System.out.println("无数据"); return; } for (int i=front;i<front+size();i++){ System.out.printf("arr[%d]=%d\n",i%maxSize ,arr[i%maxSize]); } } /** *当前队列的个数 * @return */ public int size(){ return (rear+maxSize-front)%maxSize; } //显示队列头,注意不是取出数据 public int headQueue(){ //判断队列是否是空 if(isEmpty()){ //通过抛出异常 throw new RuntimeException("队列空,不能去数据"); } return arr[front]; } }