栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

(2) 数组实现队列

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

(2) 数组实现队列

队列
  1. 队列是一个有序列表,可以用数组或是链表来实现。
  2. 遵循先入先出的原则。即:先存入队列的数据,要先取出。后存入的要后取出
  3. 示意图:(使用数组模拟队列示意图)
数组模拟队列思路

1.队列本身是有序列表,若使用数组的结构来存储队列的数据,则队列数组的声明如下图:其中 maxSize 是该队列的最大容量。

2.因为队列的输出、输入是分别从前后端来处理,因此需要两个变量 front 及 rear 分别记录队列前后端的下标,front 会随着数据输出而改变,而 rear 则是随着数据输入而改变,如图所示:

3.当我们将数据存入队列时称为”addQueue”,addQueue 的处理需要有两个步骤:思路分析
1) 将尾指针往后移:rear+1 , 当 front ==rear队列为空
2) 若尾指针 rear 小于队列的最大下标 maxSize-1,则将数据存入 rear 所指的数组元素中,否则无法存入数据。
rear == maxSize - 1[队列满]

存在问题:
无法复用

代码实现
import java.util.Scanner;

public class ArrayQueueDemo {
    //测试
    public static void main(String[] args) {
        ArrayQueue queue=new ArrayQueue(3);
        char key=' '; //接受的用户指令
        Scanner sc=new Scanner(System.in);
        boolean loop=true;
        while(loop) {
            System.out.println("s(show): 显示队列");
            System.out.println("e(exit): 退出程序");
            System.out.println("a(add): 添加数据到队列");
            System.out.println("g(get): 从队列取出数据");
            System.out.println("h(head): 查看队列头的数据");
            key = sc.next().charAt(0);//接收一个字符

            switch (key) {
                case 's':
                    queue.showQueue();
                    break;
                case 'a':
                    System.out.println("输出一个数");
                    int value = sc.nextInt();
                    queue.addQueue(value);
                    break;
                case 'g': //取出数据
                    try {
                        int res = queue.getQueue();
                        System.out.printf("取出的数据是%dn", res);
                    } catch (Exception e) {
                        System.out.println(e.getMessage());
                    }
                    break;
                case 'h': //查看队列头的数据
                    try {
                        int res = queue.peek();
                        System.out.printf("队列头的数据是%dn", res);
                    } catch (Exception e) {
                        System.out.println(e.getMessage());
                    }
                    break;
                case 'e': //退出
                    sc.close();
                    loop = false;
                    break;
                default:
                    break;
            }
        }
        System.out.println("程序退出~~");
    }
    }






    

    class ArrayQueue{
       private int maxSize; //数组的最大容量
       private int front; //队头
       private int rear; //队尾
       private int[] arr; //存放数据的数组,模拟队列

       //创建队列的构造方法 给定队列大小
       public ArrayQueue(int maxSize){
           this.maxSize=maxSize;
           arr=new int[maxSize];
           front=-1;  //指向队列头部,分析出 front 是指向队列头的前一个位置
           rear=-1;   //指向队列尾,指向队列尾的数据(即就是队列最后一个数据)
       }

       //判断队列是否已满
        public boolean isFull(){
           return rear==maxSize-1; //已经移到数组的最后一个位置,则已满
        }

        //判断队列是否为空
        public boolean isEmpty(){
           return rear==front; //头尾指到一个位置 说明没有数据
        }

        //添加数据到队列
        public void addQueue(int n){
           //先判断队列是否已满
            if(isFull()){
                System.out.println("队列已满,不能加入");
                return;
            }
            rear++; //队尾后移 加数据  第一次为0
            arr[rear]=n;
        }

        //出队列
        public int getQueue(){
           //先判断队列是否为空
           if(isEmpty()){
               throw new RuntimeException("队列为空");//抛出运行时异常 队列为空
           }

           front++;  //先进先出,队头后移
           return arr[front];
        }

        //显示队列所有数据
        public void showQueue(){
           if(isEmpty()){
               System.out.println("队列为空");
               return;
           }
           for(int i=0;i
               System.out.printf("arr[%d]=%dn",i,arr[i]);
           }
        }

        //显示队列头 ,注意不是取出头
        public int peek(){
            if(isEmpty()){
                throw new RuntimeException("对列为空");
            }
            return arr[front+1];
        }
    }


测试结果:

"C:Program FilesJavajdk1.8.0_221binjava.exe" "-javaagent:D:ideaIntelliJ IDEA 2022.1libidea_rt.jar=55910:D:ideaIntelliJ IDEA 2022.1bin" -Dfile.encoding=UTF-8 -classpath "C:Program FilesJavajdk1.8.0_221jrelibcharsets.jar;C:Program FilesJavajdk1.8.0_221jrelibdeploy.jar;C:Program FilesJavajdk1.8.0_221jrelibextaccess-bridge-64.jar;C:Program FilesJavajdk1.8.0_221jrelibextcldrdata.jar;C:Program FilesJavajdk1.8.0_221jrelibextdnsns.jar;C:Program FilesJavajdk1.8.0_221jrelibextjaccess.jar;C:Program FilesJavajdk1.8.0_221jrelibextjfxrt.jar;C:Program FilesJavajdk1.8.0_221jrelibextlocaledata.jar;C:Program FilesJavajdk1.8.0_221jrelibextnashorn.jar;C:Program FilesJavajdk1.8.0_221jrelibextsunec.jar;C:Program FilesJavajdk1.8.0_221jrelibextsunjce_provider.jar;C:Program FilesJavajdk1.8.0_221jrelibextsunmscapi.jar;C:Program FilesJavajdk1.8.0_221jrelibextsunpkcs11.jar;C:Program FilesJavajdk1.8.0_221jrelibextzipfs.jar;C:Program FilesJavajdk1.8.0_221jrelibjavaws.jar;C:Program FilesJavajdk1.8.0_221jrelibjce.jar;C:Program FilesJavajdk1.8.0_221jrelibjfr.jar;C:Program FilesJavajdk1.8.0_221jrelibjfxswt.jar;C:Program FilesJavajdk1.8.0_221jrelibjsse.jar;C:Program FilesJavajdk1.8.0_221jrelibmanagement-agent.jar;C:Program FilesJavajdk1.8.0_221jrelibplugin.jar;C:Program FilesJavajdk1.8.0_221jrelibresources.jar;C:Program FilesJavajdk1.8.0_221jrelibrt.jar;D:idea-workspace20220508outproduction20220508" ArrayQueueDemo
s(show): 显示队列
e(exit): 退出程序
a(add): 添加数据到队列
g(get): 从队列取出数据
h(head): 查看队列头的数据
a
输出一个数
3
s(show): 显示队列
e(exit): 退出程序
a(add): 添加数据到队列
g(get): 从队列取出数据
h(head): 查看队列头的数据
s
arr[0]=3
arr[1]=0
arr[2]=0
s(show): 显示队列
e(exit): 退出程序
a(add): 添加数据到队列
g(get): 从队列取出数据
h(head): 查看队列头的数据
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/874408.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号