数据结构--循环队列

220 阅读1分钟

在https://juejin.cn/post/6844904147225935886这篇文章写的队列,有一个缺点,就是在队列取出一个元素之后,那么就要需要把后面的元素都往前移动一个位置,那么循环队列可以解决这个问题

public class LoopQueue {

private E[] data;
//统计队列元素的数量
private int size;
//下一个可以放置元素的第一个位置
private int tail;
//取出第一个元素的位置
private int front;

public LoopQueue(int capacity) {
    this.data = (E[])new Object(capacity);
    this.size = 0;
    this.front = 0;
    this.tail = 0;
}

public LoopQueue() {
    this(10);
}

//获取队列元素个数
public int getSize() {
    return size;
}

//判断元素是否为空
public boolean isEmpty() {
    return size == 0;
}

//添加元素
public void push(E e) {
    if( (tail + 1) % data.length == front)
       //需要扩容
       resize(data.length * 2);
    data[tail] = e;
    //维护tail索引位置
    tail = (tail + 1) % data.length;
    size++;
}

//取出元素
public E pop() {
    if(isEmpty()) {
        throw new IllegalArgumentException("队列没有元素");
    }
    E resu = data[front];
    front = (front + 1) % data.length;
    size --;
    return resu;
}

//扩容
private void resize (int newCapacity) {
    E[] newData = (E[])new Object(newCapacity);
    for(int = 0; i < size; i ++) {
        newData[i] = data[(front+i) % data.length];
    }
    data = newData;
    front = 0;
    tail = 0;
}

}