Java数据结构和算法

数据结构之 环形队列【数组实现】

2019-08-22  本文已影响0人  测试员

简述

队列是一个有序列表,可以用数组或是链表来实现。
遵循先入先出的原则。即:先存入队列的数据,要先取出。后存入的要后取出


实现思路

1)既然是环形队列,那就一定有头有尾,有容量
2)既然是数组实现,那一定有个算法保证可以让数组循环起来


实现代码

/**
 * 这是一个重复可用的环形链表 但是 数字下标为maxSize的位置没有使用
 */
public class ArrayQueue {
    /**
     * 最大总量
     */
    private int maxSize;
    /**
     * 队列头
     */
    private int front;
    /**
     * 队列尾
     */
    private int rear;
    /**
     * 存放数据用的数组队列
     */
    private int[] queueArray;

    /**
     * 初始化一个maxSize长度的数组队列。
     *
     * @param maxSize
     */
    public ArrayQueue(int maxSize) {
        this.maxSize = maxSize;
        this.queueArray = new int[maxSize];
    }

    /**
     * 判断队列是否满
     */
    public boolean isFull() {
        return (rear + 1) % maxSize == front;
    }

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

    /**
     * 往队列中添加一个元素
     *
     * @param element
     * @return
     */
    public boolean addQueue(int element) {

        boolean flag = false;
        if (isFull()) {
            return flag;
        }
        //队尾后移一位
        queueArray[rear] = element;
        rear = (rear + 1) % maxSize;
        flag = true;
        return flag;
    }

    /**
     * @return 弹出&获取当前队首任务
     */
    public int takeQueue() {
        if (isEmpty()) {
            throw new RuntimeException("队列为空");
        }
        //队首后移一位
        int value = queueArray[front];
        queueArray[front] = 0;
        front = (front + 1) % maxSize;
        return value;
    }

    /**
     * 显示队列里的数据
     */
    public void showQueue() {
        if (isEmpty()) {
            System.out.println("队列里没有数据");
            return;
        }
        for (int i = front; i < front + size(); i++) {
            System.out.println("当前数据顺序位数 = " + queueArray[i]);
        }
    }

    /**
     * @return 队列中有效数据个数
     */
    public int size() {
        return (rear + maxSize - front) % maxSize;
    }
}
上一篇下一篇

猜你喜欢

热点阅读