• jQuery火箭图标返回顶部代码


    使用数组模拟队列

    初始化队列

    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
    ", 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
    ", 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:环形队列

  • 相关阅读:
    电子工程师的血泪史
    最简单的bootloader的编写步骤
    6811汇编语言
    Tiny6410SHT10温湿度传感器
    Tiny6410裸机程序
    无线收发模块NRF24LU1和NRF24LE1
    转载工作10年的人总结的6句话
    Tiny6410取模软件设置
    别人的感悟
    在Windows下用Virtualbox虚拟linux时共享文件夹设置的方法
  • 原文地址:https://www.cnblogs.com/TJ21/p/13647303.html
Copyright © 2020-2023  润新知