zoukankan      html  css  js  c++  java
  • 数组模拟队列 以及队列的复用(环形队列)

    使用数组模拟队列

    初始化队列

    private int front; 指向队列头的第一个元素

    privat int maxSzie; 设置队列的最大长度

    private int rear; 指向队列尾的最后一个元素的后一个位置,留出一个位置作为约定

    因为需要留出一个位置作为约定,那么当数组的maxSize == 4;的时候有效数据的个数就等于3个

    private int[] arr; 使用数组来存储数据,模拟环形队列

    那么队列就会形成一个圆环形状的 如下图:

    通过分析可以得出front == rear的时候环形队列是空的

    当对列满的时候就是 (rear + 1) % maxSize == front;

    队列的有效数据个数(rear + maxSize - front) % maxSize;

    队列的有效数据个数就可以用来遍历出整个环形队列的有效值

    遍历从front头指针开始

    代码实现:

    通过开始判断出来的思路,写代码实现

    队列的判空和判满

     /**
         * 用来判断环形队列是否满的状态
         *
         * @return
         */
        public boolean isFull() {
            return (rear + 1) % maxSize == front;
        }
    
        /**
         * 判断队列是否为空
         *
         * @return
         */
        public boolean isEmpty() {
            return rear == front;
        }
    

    向环形队列中添加一个元素和取出元素

     /**
         * 向队列添加一个元素
         *
         * @param number
         */
        public void addQueue(int number) {
            if (isFull()) {
                System.out.println("队列满,无法加入数据·····");
                return;
            }
            arr[rear] = number;
            //将rear后移,向后移动指针的时候必须要考虑取模,不然就会造成数组越界
            rear = (rear + 1) % maxSize;
        }
    
        /**
         * 从队列中取出一个元素
         *
         * @return
         */
        public int getQueue() {
            if (isEmpty()) {
                new RuntimeException("当前队列为空,不能取出数据");
            }
            /**
             * front 指向队列的第一个元素
             * 1、先吧front保存在一个临时变量
             * 2、将front后移,后移指针的时候一样必须考虑取模,否则也会造成数组越界
             * 3、将临时保存的变量返回
             */
    
            int val = arr[front];
            front = (front + 1) % maxSize;
            return val;
        }
    

    显示队列的所有元素--难点

    最重要的是需要计算出来数组中有多少个有效数值

    通过思路分析已经得初有效数值的个数(rear + maxSize - front) % maxSize; 这就是数组的有效数据个数

    并且数组的第一个元素是从front开始,那么就需要从front开始遍历

    for(int i = front ; i < front + ((rear + maxSize - front) % maxSize); i++){
        //在遍历的时候必须要考虑取模,不然就会数组越界
        System.out.printf("arr[%d] = %d\n", i % maxSize, arr[i % maxSize]);
    }
    

    具体的代码实现为:

    /**
         * 显示队列所有元素
         *
         * @return
         */
        public void showQueue() {
            if (isEmpty()) {
                //当前队列为空,不能取出数据
                System.out.println("队列为空,没有数据·····");
                return;
            }
            //思路:从front开始遍历,遍历多少个元素呢
            for (int i = front; i < front + size(); i++) {
                System.out.printf("arr[%d] = %d\n", i % maxSize, arr[i % maxSize]);
            }
        }
    
        /**
         * 求出当前队列的有效数据的个数
         *
         * @return
         */
        public int size() {
            return (rear + maxSize - front) % maxSize;
        }
    

    输出队列的第一个元素

    因为 front指向的就是队列头的第一个元素,那么arr[front]就是第一个元素

     /**
         * 取出队列头元素
         *
         * @return
         */
        public int headQueue() {
            if (isEmpty()) {
                new RuntimeException("队列为空,不能取出数据·····");
            }
            return arr[front];
        }
    

    整篇源码查看

    gitee:环形队列

    github:环形队列

    本文来自博客园,作者:BaldHead,转载请注明原文链接:https://www.cnblogs.com/strict/p/13647303.html

  • 相关阅读:
    ECharts 提供了常规的折线图、柱状图、散点图、饼图、K线图, echarts3+ajax+json+SpringMVC+mybatis
    数据可视化—ECharts图表的应用
    关于老猿Python系列文章发布网址变化的说明
    hitorMiss、hitAndMiss以及MORPH_HITMISS?
    OpenCV图像处理MORPH_HITMISS入门使用理解
    OpenCV击中击不中HMT形态变换最容易理解的解释
    区块链学习7:超级账本项目Fabric中的背书、背书节点、背书策略、背书签名
    Python音视频开发:消除抖音短视频Logo的图形化工具实现
    Python音视频开发:消除抖音短视频Logo和去电视台标
    Python音视频开发:消除抖音短视频Logo的图形化工具实现过程详解
  • 原文地址:https://www.cnblogs.com/strict/p/13647303.html
Copyright © 2011-2022 走看看