数据结构-数组模拟环形队列

    科技2024-01-07  89

    思路分析

    front指向队列的第一个元素,且front的初始值为0

    rear指向队列最后一个元素的下一个位置,因为希望空出一个空间做约定,rear的初始值为0 注意:为什么要留有一个空位置呢 若不留有空位置,rear指向队列的末尾元素的下一个位置,会导致队满的时候与队空的时候判断条件会是一样的,都是rear == front

    当队列满时,条件是(rear + 1)% maxSize = front

    队列为空的条件,rear == front

    这样分析时,队列中有效元素的个数为(rear + maxSize - front) % maxSize

    这样就能够得到一个环形队列

    代码实现

    class CircleQueue{ private int maxSize; private int front; private int rear; private int[] shuzu; public CircleQueue(int maxSize) { this.maxSize = maxSize; this.shuzu = new int[maxSize]; this.front = 0; this.rear = 0; } /** * 添加元素 * @param i */ public void addQueue(int i){ //判断队列是否满 if(isFull()){ System.out.println("队列满了,无法再进入了"); }else{ shuzu[rear] = i; rear = (rear + 1) % maxSize; } } /** * 移除元素 */ public void removeQueue(){ //判断队列是否为空 if(isEmpty()){ System.out.println("队列为空,无元素可以移除"); }else{ front = (front + 1) % maxSize; } } /** * 判断队列是否满 * @return */ public boolean isFull(){ return (rear + 1) % maxSize == front ? true : false; } /** * 判断队列是否为空 * @return */ public boolean isEmpty(){ return front == rear ? true : false; } /** * 打印数组 */ public void print(){ for(int i = front;i < front + size();i++){ System.out.printf("%d\t",shuzu[i % maxSize]); } } /** * 求循环队列目前元素个数 */ public int size(){ return (rear + maxSize - front) % maxSize; } }
    Processed: 0.013, SQL: 8