数组模拟环形队列
作者:互联网
思路:
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