其他分享
首页 > 其他分享> > 数组模拟环形队列

数组模拟环形队列

作者:互联网

思路:

  1、front变量:指向队列的第一个元素,arr[front]就是队列的第一个元素

    front=0

  2、rear变量:rear指向队列的最后一个元素的后一个位置,空出一个空间做约定

    rear=0

  3、当队列满时,条件是(rear+1)%maxSize = front [满]

  4、对队列为空的条件,rear == front 空

  5、当我们这样分析,队列中有效的数据个数 (rear+maxSize -front) % maxSize 

  1 import java.util.Scanner;
  2 
  3 public class CircleArrayQueue {
  4     public static void main(String[] args) {
  5         //测试
  6         CircleQueue queue = new CircleQueue(4);
  7         char key = ' ';//接收用户输入
  8         Scanner scanner = new Scanner(System.in);
  9         boolean loop = true;
 10 
 11         //输出一个菜单
 12         while(loop){
 13             System.out.println("s(show):显示队列");
 14             System.out.println("e(exit):退出程序");
 15             System.out.println("a(add):添加数据到队列");
 16             System.out.println("g(get):从队列取出数据");
 17             System.out.println("h(show):查看队列的头数据");
 18             key = scanner.next().charAt(0);//接收一个字符
 19             switch(key){
 20                 case 's':
 21                     queue.showQueue();
 22                     break;
 23                 case 'a':
 24                     System.out.println("输出一个数");
 25                     int value = scanner.nextInt();
 26                     queue.addQueue(value);
 27                     break;
 28                 case 'g':
 29                     try{
 30                         int res = queue.getQueue();
 31                         System.out.printf("取出的数据是%d\n",res);
 32                     }catch (Exception e){
 33                         System.out.println(e.getMessage());
 34                     }
 35                     break;
 36                 case 'h'://查看队列的头数据
 37                     try{
 38                         int res = queue.headQueue();
 39                         System.out.printf("队列的头数据是%d\n",res);
 40                     }catch (Exception e){
 41                         System.out.println(e.getMessage());
 42                     }
 43                     break;
 44                 case 'e'://退出
 45                     scanner.close();
 46                     loop = false;
 47                     break;
 48                 default:
 49                     break;
 50             }
 51         }
 52         System.out.println("程序退出");
 53 
 54     }
 55 
 56 
 57 }
 58 
 59 //使用数组模拟队列-CircleQueue类
 60 class CircleQueue{
 61     private int maxSize;//表示数组的最大容量
 62     private int front;//指向队列的第一个元素,arr[front]就是队列的第一个元素
 63     private int rear; //rear指向队列的最后一个元素的后一个位置,空出一个空间做约定
 64     private int[] arr; //该数据用于存放数据,模拟队列
 65 
 66     //创建队列的构造器
 67     public CircleQueue(int arrMaxSize){
 68         maxSize = arrMaxSize;
 69         arr = new int[maxSize];
 70         front = 0; //
 71         rear = 0; //
 72     }
 73     //判断队列是否满
 74     public boolean isFull(){
 75         return (rear + 1) % maxSize == front;//front>rear时 中间有一个空间,rear为0 front为1,
 76                                             // 说明1到数组最大位置都有数据,数据最大的位置就是rear的前一位置
 77     }
 78 
 79     //判断队列是否为空
 80     public boolean isEmpty(){
 81         return rear == front; //front和rear位置一样代表数据已被取完 因rear指针是指向空的
 82     }
 83     //添加数据到队列
 84     public void addQueue(int n){
 85         //判断队列是否满
 86         if (isFull()){
 87             System.out.println("队列满,不能加入数据");
 88             return;
 89         }
 90 
 91         arr[rear]=n;
 92         //将rear后移
 93         rear = (rear+1) % maxSize;
 94 
 95 
 96     }
 97 
 98     //获取队列的数据,出队列
 99     public int getQueue(){
100         //判断队列是否空
101         if (isEmpty()){
102             //通过抛出异常处理
103             throw new RuntimeException("队列空,不能取数据");
104 
105         }
106        //分析出front指向队列的第一个元素
107         //1.先把front对应的值保存到一个临时变量
108         //2.将front后移,考虑取模
109         //3.将临时保存的变量返回
110         int value = arr[front];
111         front = (front +1)% maxSize;
112         return value;
113 
114     }
115 
116     //显示队列的所有数据
117     public void showQueue(){
118         //遍历
119         if (isEmpty()){
120             System.out.println("队列空的,没有数据");
121             return;
122         }
123         //思路:从front开始遍历,遍历多少个元素
124         for (int i = front; i <front + size() ; i++) {//front作为起始点
125             System.out.printf("arr[%d]=%d\n",i % maxSize,arr[i % maxSize]);
126         }
127     }
128     //求出当前队列有效数据的个数
129     public  int size(){
130         //
131         return (rear + maxSize - front) % maxSize;
132     }
133 
134     //显示队列的头数据,注意不是取出数据
135     public int headQueue(){
136         //判断
137         if (isEmpty()){
138 
139             throw new RuntimeException("队列空的,没有数据");
140         }
141         return arr[front];
142     }
143 }

 

标签:队列,环形,System,int,数组,front,rear,out
来源: https://www.cnblogs.com/doremi429/p/16083051.html