环形队列

环形队列 (解决顺序队列假上溢的问题)环形队列_第1张图片

/**
 * 循环队列
 *
 * @Author: gb.wang
 * @Date 2020/5/18 15:25
 * @Version 1.0
 */
public class CircularQueue {

    // 数组模拟队列
    private Object[] arr;

    // 队列的最大容量
    private int maxSize;

    // head指针
    private int front;

    // rear尾指针
    private int rear;

    // 有效数据数量(主要是用来循环数组显示数据用)
    private int elementNum;

    public CircularQueue(int capacity) {
        if (capacity <= 0) {
            throw new IllegalArgumentException("初始容量不能小于0!");
        }
        arr = new Object[capacity];
        maxSize = capacity;
        front = 0;
        rear = 0;
        elementNum = 0;
    }

    public void show() {
        if (isEmpty()) {
            throw new RuntimeException("队列为空!");
        }
        //循环
        for (int i = front; i < front + elementNum; i++) {
            System.err.println((i % maxSize) + "---->" + arr[i % maxSize]);
        }
    }

    /**
     * 入队
     */
    public void put(T t) {
        // 先判断下数组是否是满了
        if (isFull()) {
            throw new RuntimeException("队列已满!");
        }
        arr[rear] = t;
        // 因为要保证队尾在一个圆形周期内
        rear = (rear + 1) % maxSize;
        // 有效数据要+1
        elementNum++;
    }

    /**
     * 出队
     */
    public T poll() {
        if (isEmpty()) {
            throw new RuntimeException("队列为空!");
        }
        T t = (T) arr[front];
        front = (front + 1) % maxSize;
        // 有效数据要-1
        elementNum--;
        return t;
    }

    /**
     * 判断是否队满
     * 1. 因为队尾需要空一个元素
     */
    public boolean isFull() {
        return (this.rear + 1) % maxSize == front;
    }

    /**
     * 判空条件
     * 当front==rear的时候,是空队列
     */
    public boolean isEmpty() {
        return this.front == this.rear;
    }

    public static void main(String[] args) {
        CircularQueue queue = new CircularQueue(5);
        queue.put(1);
        queue.put(2);
        queue.put(3);
        queue.put(4);
        queue.show();
        System.err.println("------------------------");
        queue.poll();
        queue.poll();
        queue.show();
        System.err.println("------------------------");
        queue.put(2);
        queue.put(1);
        queue.show();
    }
}

 

你可能感兴趣的:(java数据结构)