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数组模拟环形队列(没有明白)的主要内容,如果未能解决你的问题,请参考以下文章

java数据结构与算法:单向队列与环形队列详解(图片+代码)

Java数据结构 -- 环形队列 & 数组模拟环形队列

队列——使用数组模拟环形队列

Go 数组模拟环形队列

Go 数组模拟环形队列

使用数组模拟普通队列,环形队列,(Java数据结构之队列)