数组模拟队列 以及队列的复用(环形队列)

使用数组模拟队列

初始化队列

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