码迷,mamicode.com
首页 > 编程语言 > 详细

02队列(数组模拟队列)

时间:2020-01-28 21:28:36      阅读:62      评论:0      收藏:0      [点我收藏+]

标签:max   idt   com   char   内存   time   算法   ret   nta   

1,对列介绍

  技术图片  技术图片

 2,数组模拟队列

  技术图片

    技术图片

 3,数组模拟队列代码实现

  1 package DataStructures01;
  2 
  3 import java.util.Scanner;
  4 
  5 public class QueueArray {
  6     public static void main(String[] args) {
  7         //测试
  8         //创建一个队列
  9         ArrayQueue queue = new ArrayQueue(3);
 10         char key=‘ ‘;//接收用户的输入
 11         Scanner s=new Scanner(System.in);
 12         boolean loop=true;
 13         //输出一个指令提示菜单
 14         while(loop) {
 15             System.out.println("s(show):显示队列所有数据");
 16             System.out.println("a(add):添加数据到队列");
 17             System.out.println("g(get):从队列取出数据");
 18             System.out.println("e(exit):退出程序");
 19             System.out.println("h(head):查看队列头数据");
 20             key=s.next().charAt(0);//接收用户输入的一个字符
 21             
 22             switch(key) {
 23             case ‘s‘:
 24                 queue.showQueue();break;
 25             case ‘a‘:
 26                 System.out.println("请输入一个数据");
 27                 int value=s.nextInt();
 28                 queue.addQueue(value);break;
 29             case ‘g‘://取出数据,如果是空要处理异常
 30                 try {
 31                     System.out.println("取出的数据是: " +queue.getQueue());
 32                 }
 33                 catch(Exception e){
 34                     System.out.println(e.getMessage());
 35                 }
 36                 break;
 37             case ‘e‘:
 38                 s.close();
 39                 loop=false;
 40                 break;
 41             case ‘h‘:
 42                 try {
 43                     System.out.println("队列中的第一个数据是: " +queue.headQueue());
 44                     break;
 45                 }
 46                 catch(Exception e){
 47                     System.out.println(e.getMessage());
 48                 }
 49             default:
 50                 break;
 51             }
 52         }
 53         System.out.println("---程序退出----");//while循环结束
 54     }
 55     
 56 }
 57 
 58 
 59 //使用数组模拟队列,编写一个ArrayQueue类
 60 class ArrayQueue{
 61     private    int maxSize; //表示数组的最大容量
 62     private int front;//队列头,
 63     private int rear;//队列尾,
 64     private int[] arr;//该数组用于存放数据,模拟队列
 65     
 66     //创建队列的构造器
 67     public ArrayQueue(int max){
 68         maxSize=max;
 69         arr=new int[maxSize];
 70         front=-1;//指向队列头部,front表示队列第一个位置的前一个位置,第一个位置是0,前一个位置是-1
 71         rear=-1;//指向队列尾部,如果rear不是-1而是0,那就说明队列中存在了一个数据,所以一开始front和rear都是-1
 72     }
 73     //判断队列是否满,rear=maxSize-1的时候
 74     public boolean isFull(){
 75         return rear==maxSize-1;
 76     }
 77     //判断队列是否空,front==rear的时候,中间没有数据???
 78     public boolean isEmpty() {
 79         return front==rear;
 80     }
 81     //添加数据到队列,要注意队列是否满了,满了不能添加
 82     public void addQueue(int n) {
 83         if(isFull()) {
 84             System.out.println("队列数据已满,不能添加数据了");
 85             return;
 86         }
 87         rear++;//让rear后移
 88         arr[rear]=n;
 89         
 90     }
 91     //获取队列数据,出队列,注意要判断队列是否空了,空了无法获取队列数据,因为获取这个方法是有返回值的,所以队列空了,要抛出异常,调用的时候要捕获并处理这个异常,需要返回值的方法必须要返回值或者抛出异常
 92     public int getQueue() {
 93         if(isEmpty()){
 94             throw new RuntimeException("队列空,无法获取队列数据");
 95         }
 96         front++;//front后移
 97         return arr[front];
 98     }
 99     //显示队列所有数据,遍历,注意也要判断是否空
100     public void showQueue() {
101         if(isEmpty()) {
102             System.out.println("队列是空的,无法显示所有数据");//不需要返回值的方法,只需要简单提示
103             return;
104         }
105         for(int i=0;i<arr.length;i++) {
106             //System.out.print(arr[i]+" ");
107             System.out.printf("arr[%d]=%d\n", +i,arr[i]);
108         }
109     }
110     //显示队列头数据,注意是有返回值的,空的情况下要抛出异常
111     public int headQueue() {
112         if(isEmpty()) {
113             throw new RuntimeException("队列中没有数据,无法显示第一个数据");
114             //return;注意throw后面不用加return,因为到throw已经可以结束了,不会继续执行
115             //System.out.println("hhh");//提示unreachable code ,证明throw后面的代码不执行
116         }
117         System.out.println(arr[front+1]);//注意这里front本身是执行队列头的前一个位置,并不是直接执行队列的,所以需要加1
118     }
119 }

4,控制台打印结果:

s(show):显示队列所有数据
a(add):添加数据到队列
g(get):从队列取出数据
e(exit):退出程序
h(head):查看队列头数据
s
队列是空的,无法显示所有数据
s(show):显示队列所有数据
a(add):添加数据到队列
g(get):从队列取出数据
e(exit):退出程序
h(head):查看队列头数据
a
请输入一个数据
1
s(show):显示队列所有数据
a(add):添加数据到队列
g(get):从队列取出数据
e(exit):退出程序
h(head):查看队列头数据
a
请输入一个数据
2
s(show):显示队列所有数据
a(add):添加数据到队列
g(get):从队列取出数据
e(exit):退出程序
h(head):查看队列头数据
a
请输入一个数据
3
s(show):显示队列所有数据
a(add):添加数据到队列
g(get):从队列取出数据
e(exit):退出程序
h(head):查看队列头数据
s
arr[0]=1
arr[1]=2
arr[2]=3
s(show):显示队列所有数据
a(add):添加数据到队列
g(get):从队列取出数据
e(exit):退出程序
h(head):查看队列头数据
g
取出的数据是: 1
s(show):显示队列所有数据
a(add):添加数据到队列
g(get):从队列取出数据
e(exit):退出程序
h(head):查看队列头数据
g
取出的数据是: 2
s(show):显示队列所有数据
a(add):添加数据到队列
g(get):从队列取出数据
e(exit):退出程序
h(head):查看队列头数据
g
取出的数据是: 3
s(show):显示队列所有数据
a(add):添加数据到队列
g(get):从队列取出数据
e(exit):退出程序
h(head):查看队列头数据
g
队列空,无法获取队列数据
s(show):显示队列所有数据
a(add):添加数据到队列
g(get):从队列取出数据
e(exit):退出程序
h(head):查看队列头数据
a
请输入一个数据
10
队列数据已满,不能添加数据了
s(show):显示队列所有数据
a(add):添加数据到队列
g(get):从队列取出数据
e(exit):退出程序
h(head):查看队列头数据

5,tips:

  ①不需要返回值的方法:添加数据到队列,,

  ②需要返回值的方法:从队列中取出数据,显示队列中的所有数据,显示队列第一个数据

  ③对于不需要返回值的方法,如果有异常,只需要简单提示就好

  ④对于需要返回值的方法,需要返回值或者抛出异常

  ⑤方法中通过throw抛出异常后,相应的测试代码中调用该方法时,要通过try...catch捕获和处理异常

  ⑥class ArrayQueue如果是main方法的内部类,要在class前加static,否则报错 editor does not contain a main type,这是因为main方法是静态的,在一个类的静态成员中去访问非静            态成员之所以会出错是因为在类的非静态成员不存在的时候静态成员就已经存在了,访问一个内存中不存在的东西当然会出错。(Java内存机制)

6程序bug

数组只能用一次,不能复用

7,改进

将这个数组使用算法,改进成一个环形队列,取模%

02队列(数组模拟队列)

标签:max   idt   com   char   内存   time   算法   ret   nta   

原文地址:https://www.cnblogs.com/shanlu0000/p/12238644.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!