数据结构之循环队列Demo

循环队列


 

比较简单,循环队列主要是判断队满、队空、有效元素个数

画图说明:


 

假设:队的长度为5(0-4)

但是实际maxsize为6,需要一个预留空间(不存储元素)做计算



 

 继续添加3个元素后:

 



 

 出队一个元素



 

下面是完整循环队列代码demo:

public class CircleArrayQueueDemo {
    private int maxSize;
    private int front;
    private int rear;
    private int[] arr;

    public static void main(String[] args) {
        CircleArrayQueueDemo caq = new CircleArrayQueueDemo(4);
        caq.addQueue(10);
        caq.addQueue(20);
        caq.addQueue(30);
        caq.addQueue(40);
        System.out.println("加入10,20,30,40");
        caq.showQueue();
        System.out.println("出队,此时队里还剩下:");
        caq.getQueue();
        caq.showQueue();
        System.out.println("出队,此时队里还剩下:");
        caq.getQueue();
        caq.showQueue();
        System.out.println("出队,此时队里还剩下:");
        caq.getQueue();
        caq.showQueue();
        System.out.println("加入10,20,30,40");
        caq.addQueue(10);
        caq.addQueue(20);
        caq.addQueue(30);
        caq.addQueue(40);
        caq.showQueue();
    }

    public CircleArrayQueueDemo(int maxSize) {
        this.maxSize = maxSize+1;
        arr = new int[maxSize+1];
    }

    public boolean isFull() {
        return (rear + 1) % maxSize == front;//队满条件
    }

    public boolean isEmpty() {
        return rear == front;//队空条件
    }

    public void addQueue(int data) {
        if (isFull()) {
            System.out.println("队已满,不能加入");
            return;
        }
        arr[rear] = data;
        rear = (rear + 1) % maxSize;//取模运算防止越界,以及循环作用
    }

    public int getQueue() {
        if (isEmpty()) {
            throw new RuntimeException("队为空,不能取数据");
        }
        int tmp = arr[front];
        front = (front+1) % maxSize;//取模运算防止越界,以及循环作用
        return tmp;
    }

    public void showQueue() {
        if (isEmpty()) {
            System.out.println("队为空");
        }
     //从队首遍历,假设队头在index为1的位置,(size+front)-front=size,总数不变
for (int i = front; i < front + size(); i++) {
       //取模防止越界与起循环作用 System.out.printf("arr[%d]=%d\n", i % maxSize, arr[i % maxSize]); } } public int size() { return (rear + maxSize - front) % maxSize;//有效元素的数量 } }

 

posted @ 2020-04-18 01:00  两仪子  阅读(179)  评论(0编辑  收藏  举报