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是因为头结点指向的是队列的前一个数据
        }
    }
  • 相关阅读:
    cpu gpu数据同步
    metal &object c
    unity macro 分平台处理
    unity reflection probe --- forward deferred transparent opaque
    unity pbr
    unity 实时间接光照 解决方案
    Gpu driven rendering pipelines & bindless texture
    在创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke
    转自大楚网:微软SAPI:让你的软件能说会道
    (转) 使用Speech SDK 5.1文字转音频
  • 原文地址:https://www.cnblogs.com/zhangzhixi/p/13509069.html
Copyright © 2011-2022 走看看