数据结构与算法(二)——队列&循环队列

232 阅读1分钟

队列(Queue)&循环队列(CircleQueue)

使用数组实现队列

class ArrayQueue {
    private int maxSize;
    private int front;
    private int rear;
    private int[] arr;
    
    public ArrayQueue(int maxSize) {
        this.maxSize = maxSize;
        this.front = -1;     //指向第一个元素之前
        this.rear = -1;     //指向最后一个元素
        this.arr = new int[maxSize];
    }
}

几个重要的判定条件

  • 判断队列为空
public boolean isEmpty(){
        return rear==front;
    }
  • 判断队列已满
public boolean idFull(){
        return rear==maxSize-1;
    }
  • 添加元素&取出元素
public void addQueue(int n){
        if (idFull()){
            System.out.println("队列已满");
            return;
        }
        rear++;
        arr[rear]=n;
    }

    public int outQueue(){
        if (isEmpty()){
            throw new RuntimeException("队列为空");
        }
        front++;
        return arr[front];
    }

以上代码存在的问题

数组不能复用,取出元素并没有真正释放数组中元素占用的内存。

循环队列

class Circle{
    private int maxSize;
    private int front;
    private int rear;
    private int[] arr;

    public Circle(int maxSize) {
        this.maxSize = maxSize;
        //front指向队列第一个元素
        // rear指向队列最后一个元素的后一个位置
        this.front = 0;
        this.rear = 0;
        this.arr = new int[maxSize];
    }
}

几个重要的判定条件

  • 判断队列为空
public boolean isEmpty(){
        return rear==front;
    }
  • 判断队列已满
 public boolean idFull(){
        return (rear+1)%maxSize==front;
    }
  • 添加元素&取出元素
public void addQueue(int n){
        if (idFull()){
            System.out.println("队列已满");
            return;
        }
        arr[rear]=n;
        rear=(rear+1)%maxSize;
    }

    public int outQueue(){
        if (isEmpty()){
            throw new RuntimeException("队列为空");
        }
        int val=arr[front];
        front=(front+1)%maxSize;
        return val;
    }
  • 遍历元素
 public void showAll(){
        if (isEmpty()){
            System.out.println("队列为空");
            return;
        }
        for (int i = front; i <front+getSize() ; i++) {
            System.out.println(arr[i%maxSize]);
        }
    }

    private int getSize(){
        return (rear+maxSize-front)%maxSize;
    }

Tips 重难点:理解对maxSize的取模操作。

源码参照github仓库链接