zoukankan      html  css  js  c++  java
  • 数组模拟队列

    我们先来回顾下什么是队列数据结构:

      

    1. 队列是一种先进先出,后进后出的线性表
    2. 加数据是在队列的尾部加,取数据是在队列的头部取
    3. 队列只允许在后端(称为rear )进行插入操作,在前端(称为front )进行删除操作
    4. 队列满的情况:尾结点read 等于 MaxSize-1

    分析:

      

    定义数组类 ArrayQueue:

      private int maxSize;//数组的最大容量
        private int front;//头结点
        private int read;//尾结点
        private int[] arr;//创建数组用于存放数据,模拟队列

    无参构造初始化队列:

    /**
    * 构造方法
    * @param arrMaxSize 队列能够拥有的最大容量
    */
    public ArrayQueue(int arrMaxSize){
    maxSize = arrMaxSize;//传入数据表示队列能够拥有的最大容量
    arr = new int[maxSize];//初始化数组
    front = -1;//指向队列头结点的前一个位置
    read = -1;//指向的是队列的尾结点(就是队列的最后一个数据)
    }

    队列满:

    /**
    * 判断队列是否满了,判断队列是否满的条件是:尾结点==队列最大容量-1
    * @return
    */
    public boolean isFull(){
    return read == maxSize-1;
    }

    队列空:

    /**
    * 判断队列是否为空
    * @return
    */
    public boolean isAir(){
    return front == read;
    }

    添加数据:

    /**
    * 添加数据到队列
    * @param data:添加的数据
    */
    public void add(int data){
    //先判断队列是否满
    if (isFull()){
    System.out.println("队列已满,不能加入数据!");
    return;
    }
    read++;//先让尾结点后移
    arr[read] = data;
    }

    出队列(取数据):

    /**
    * 获取队列的数据,出队列
    * @return
    */
    public int get(){
    //先判断队列是否为空
    if (isAir()){
    //通过抛出异常来解决
    throw new RuntimeException("队列空,不能取数据!");
    }
    front++;//让头结点后移一位
    return arr[front];
    }

    打印队列:

    /**
    * 打印数据,就是遍历arr数组
    */
    public void listQueue(){
    //判断队列是否为空
    if (isAir()){
    System.out.println("队列为空,没有数据!");
    }
    for (int i=0;i<arr.length;i++){
    System.out.println("arr["+i+"]="+arr[i]);
    }
    }

    显示队头数据:

    /**
    * 显示队列的头数据
    */
    public int headQueue(){
    if (isAir()){
    throw new RuntimeException("队列是空的没有数据");
    }
    return arr[front+1];//+1是因为头结点指向的是队列的前一个数据
    }

     完整代码:

    public class Test02_数组模拟队列 {
        public static void main(String[] args) {
            ArrayQueue queue = new ArrayQueue(3);
            char value = ' ';
            Scanner s = new Scanner(System.in);
            boolean loop = true;
            while (loop){
                System.out.println("==================================");
                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):查看队列头的数据");
                System.out.println("==================================");
                //接受用户输入的一个字符
                System.out.print("请输入指令:");
                value = s.next().charAt(0);
                switch (value){
                    case 's'://显示队列
                        queue.listQueue();
                        break;
                    case  'g'://取数据
                            System.out.println("取出的数据是:"+queue.get());
                        break;
                    case 'a'://添加数据
                        System.out.print("请输入一个数:");
                        int index = s.nextInt();
                        queue.add(index);
                        break;
                    case 'h'://查看队列头
                        System.out.println("队列的头是:"+queue.headQueue());
                        break;
                    case 'e'://退出程序
                        loop = false;
                        break;
                    default:
                        System.out.println("您好,您输入的字符不合法,请重新输入!");
                        break;
                }
            }
            System.out.println("您已经成功退出!");
        }
    }
    //用数组模拟队列
    class ArrayQueue{
        private int maxSize;//数组的最大容量
        private int front;//头结点
        private int read;//尾结点
        private int[] arr;//创建数组用于存放数据,模拟队列
    
        /**
         * 构造方法
         * @param arrMaxSize 队列能够拥有的最大容量
         */
        public ArrayQueue(int arrMaxSize){
            maxSize = arrMaxSize;//传入数据表示队列能够拥有的最大容量
            arr = new int[maxSize];//初始化数组
            front = -1;//指向队列头结点的前一个位置
            read = -1;//指向的是队列的尾结点(就是队列的最后一个数据)
        }
    
        /**
         * 判断队列是否满了,判断队列是否满的条件是:尾结点==队列最大容量-1
         * @return
         */
        public boolean isFull(){
            return read == maxSize-1;
        }
    
        /**
         * 判断队列是否为空
         * @return
         */
        public boolean isAir(){
            return front == read;
        }
    
        /**
         * 添加数据到队列
         * @param data:添加的数据
         */
        public void add(int data){
            //先判断队列是否满
            if (isFull()){
                System.out.println("队列已满,不能加入数据!");
                return;
            }
            read++;//先让尾结点后移
            arr[read] = data;
        }
    
        /**
         * 获取队列的数据,出队列
         * @return
         */
        public int get(){
            //先判断队列是否为空
            if (isAir()){
                //通过抛出异常来解决
                throw new RuntimeException("队列空,不能取数据!");
            }
            front++;//让头结点后移一位
            return arr[front];
        }
        /**
         * 打印数据,就是遍历arr数组
         */
        public void listQueue(){
            //判断队列是否为空
            if (isAir()){
                System.out.println("队列为空,没有数据!");
            }
            for (int i=0;i<arr.length;i++){
                System.out.println("arr["+i+"]="+arr[i]);
            }
        }
        /**
         * 显示队列的头数据
         */
        public int headQueue(){
            if (isAir()){
                throw new RuntimeException("队列是空的没有数据");
            }
            return arr[front+1];//+1是因为头结点指向的是队列的前一个数据
        }
    }
  • 相关阅读:
    Spring MVC Ajax 嵌套表单数据的提交
    Spring MVC 过滤静态资源访问
    Spring MVC 页面跳转时传递参数
    IDEA Maven 三层架构 2、运行 springMVC
    IDEA Maven 三层架构 1、基本的Archetype 搭建
    EasyUI DataGrid 基于 Ajax 自定义取值(loadData)
    Spring MVC Ajax 复杂参数的批量传递
    Mybatis Sql片段的应用
    在 Tomcat 8 部署多端口项目
    自动升级的设计思路与实现
  • 原文地址:https://www.cnblogs.com/zhangzhixi/p/13509069.html
Copyright © 2011-2022 走看看