03数组模拟环形队列(没有明白)
Posted shanlu0000
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了03数组模拟环形队列(没有明白)相关的知识,希望对你有一定的参考价值。
1,对数组模拟队列的优化,充分利用数组,因此将数组看做是一个环形的(通过取模的方式来实现)
2,分析说明:
①尾索引的下一个为头索引时表示队列满,即将队列容量空出一个作为约定,这个在做判断队列满的时候需要注意 (rear+1) % maxSize == front 满
②rear == front 空
③思路如下:
1,front变量的含义做一个调整,front就指向队列的第一个元素,front的初始值是0
2,rear便令的含义做一个调整,rear指向队列最后一个元素的后一个位置,因为希望空出一个空间作为约定,rear的初始值是0
3,当队列满时,条件是 (rear+1) % maxSize == front ;
4,当队列空时,条件是 rear == front
5, 队列中有效的数据个数是 (rear+maxSize-front) % maxSize
3,代码实现
1 package DataStructures01; 2 3 import java.util.Scanner; 4 5 import javax.print.attribute.Size2DSyntax; 6 7 public class CircleArrayQueue { 8 public static void main(String[] args) { 9 //测试 10 //创建一个环形队列 11 ArrayQueueCircle queueCircle=new ArrayQueueCircle(4);//设置为4,这个队列的有效数据最大为3 12 Scanner s= new Scanner(System.in); 13 char key=‘ ‘; 14 boolean loop=true; 15 while(loop) { 16 System.out.println("a(add):添加数据到队列中"); 17 System.out.println("g(get):从队列中取出数据"); 18 System.out.println("h(head):从队列中取出第一个数据"); 19 System.out.println("s(show):查看队列中的所有数据"); 20 key=s.next().charAt(0); 21 switch(key) { 22 case ‘a‘: 23 System.out.println("请输入一个数添加到队列中:"); 24 int value=s.nextInt(); 25 queueCircle.addQueue(value); 26 break; 27 case ‘g‘: 28 try { 29 System.out.println("从队列中取出的数据是:" +queueCircle.getQueue()); 30 } 31 catch(Exception e){ 32 System.out.println(e.getMessage()); 33 } 34 break; 35 case ‘h‘: 36 try { 37 System.out.println("队列中的第一个数据是:" +queueCircle.headQueue()); 38 } 39 catch(Exception e){ 40 System.out.println(e.getMessage()); 41 } 42 break; 43 case ‘s‘: 44 queueCircle.showQueue(); 45 break; 46 case ‘e‘: 47 s.close(); 48 loop=false; 49 break; 50 default: 51 break; 52 } 53 } 54 System.out.println("---退出程序----"); 55 } 56 57 } 58 59 class ArrayQueueCircle{ 60 private int front;//front变量的韩式做一个调整,front就指向队列的第一个元素,也就是说,arr[front]就是队列的第一个元素,front的初始值是0 61 private int rear;//队列尾,rear的含义做一个调整,rear指向队列的最后一个元素的后一个位置,因为希望空出一个空间做约定,rear的初始值是0 62 private int maxSize;//表示数组的最大容量 63 private int[] arr; 64 65 public ArrayQueueCircle(int max) { 66 maxSize=max; 67 front=0; 68 rear=0; 69 arr=new int[maxSize]; 70 } 71 72 //判断是否满 73 public boolean isFull() { 74 return (rear+1)%maxSize==front; 75 } 76 //判断是否空 77 public boolean isEmpty() { 78 return rear==front; 79 } 80 //添加数据到队列中 81 public void addQueue(int n) { 82 if(isFull()) { 83 System.out.println("队列中数据已满,不能添加了"); 84 return; 85 } 86 arr[rear]=n;//直接将数据加入队列中 87 rear=(rear+1)%maxSize;//直接将rear后移,这里必须考虑取模 88 } 89 //从队列中取出数据,出队列 90 public int getQueue() { 91 if(isEmpty()) { 92 throw new RuntimeException("队列是空的,无法取出数据"); 93 } 94 //这里需要分析出front是否指向队列的第一个元素 95 //1,先把front对应的值保留到一个临时变量 96 //2,将front后移,考虑取模 97 //3,将临时保存的变量返回 98 int value=arr[front]; 99 front=(front+1) %maxSize; 100 return value; 101 } 102 //显示队列的头数据,注意不是取出数据 103 public int headQueue() { 104 if(isEmpty()) { 105 throw new RuntimeException("队列是空的,无法取出第一个数据"); 106 } 107 return arr[front]; 108 } 109 //查看队列中的所有数据 110 public void showQueue() { 111 if(isEmpty()) { 112 System.out.println("队列是空的,无法查看队列中的所有数据"); 113 return; 114 } 115 //思路,从front开始遍历,遍历多少个元素 116 for(int i=front;i<front+size();i++) { 117 System.out.printf("arr[%d]=%d ", i%maxSize,arr[i%maxSize]); 118 } 119 } 120 //求出当前队列有效数据的个数 121 public int size() { 122 return (rear+maxSize-front) % maxSize; 123 } 124 }
控制台打印结果
a(add):添加数据到队列中 g(get):从队列中取出数据 h(head):从队列中取出第一个数据 s(show):查看队列中的所有数据 a 请输入一个数添加到队列中: 1 a(add):添加数据到队列中 g(get):从队列中取出数据 h(head):从队列中取出第一个数据 s(show):查看队列中的所有数据 a 请输入一个数添加到队列中: 2 a(add):添加数据到队列中 g(get):从队列中取出数据 h(head):从队列中取出第一个数据 s(show):查看队列中的所有数据 a 请输入一个数添加到队列中: 3 a(add):添加数据到队列中 g(get):从队列中取出数据 h(head):从队列中取出第一个数据 s(show):查看队列中的所有数据 a 请输入一个数添加到队列中: 4 队列中数据已满,不能添加了 a(add):添加数据到队列中 g(get):从队列中取出数据 h(head):从队列中取出第一个数据 s(show):查看队列中的所有数据 s arr[0]=1 arr[1]=2 arr[2]=3 a(add):添加数据到队列中 g(get):从队列中取出数据 h(head):从队列中取出第一个数据 s(show):查看队列中的所有数据 g 从队列中取出的数据是:1 a(add):添加数据到队列中 g(get):从队列中取出数据 h(head):从队列中取出第一个数据 s(show):查看队列中的所有数据 g 从队列中取出的数据是:2 a(add):添加数据到队列中 g(get):从队列中取出数据 h(head):从队列中取出第一个数据 s(show):查看队列中的所有数据 s arr[2]=3 a(add):添加数据到队列中 g(get):从队列中取出数据 h(head):从队列中取出第一个数据 s(show):查看队列中的所有数据 a 请输入一个数添加到队列中: 5 a(add):添加数据到队列中 g(get):从队列中取出数据 h(head):从队列中取出第一个数据 s(show):查看队列中的所有数据 a 请输入一个数添加到队列中: 6 a(add):添加数据到队列中 g(get):从队列中取出数据 h(head):从队列中取出第一个数据 s(show):查看队列中的所有数据 s arr[2]=3 arr[3]=5 arr[0]=6 a(add):添加数据到队列中 g(get):从队列中取出数据 h(head):从队列中取出第一个数据 s(show):查看队列中的所有数据 h 队列中的第一个数据是:3 a(add):添加数据到队列中 g(get):从队列中取出数据 h(head):从队列中取出第一个数据 s(show):查看队列中的所有数据 h 队列中的第一个数据是:3 a(add):添加数据到队列中 g(get):从队列中取出数据 h(head):从队列中取出第一个数据 s(show):查看队列中的所有数据 s arr[2]=3 arr[3]=5 arr[0]=6 a(add):添加数据到队列中 g(get):从队列中取出数据 h(head):从队列中取出第一个数据 s(show):查看队列中的所有数据 e ---退出程序----
以上是关于03数组模拟环形队列(没有明白)的主要内容,如果未能解决你的问题,请参考以下文章