在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;
}
}