数据结构之循环队列[Java]
/** * @ClassName: LoopQueue * @Author: Leo * @Description: 循环队列 * @Date: 4/4/2020 4:35 PM */
public class LoopQueue<E> implements Queue<E> {
//存放元素的数组
private E[] data;
//队首引用 队尾引用
private int front, tail;
//队列元素数量
private int size;
public LoopQueue(int capacity) {
data = (E[]) new Object[capacity + 1];
front = 0;
tail = 0;
size = 0;
}
public LoopQueue() {
this(10);
}
/** * 获取队列容积 * * @return */
public int getCapacity() {
return data.length - 1;
}
/** * 获取队列元素数量 * * @return */
@Override
public int getSize() {
return size;
}
/** * 判断队列是否为空 * * @return */
@Override
public boolean isEmpty() {
//首尾引用相等 证明队列为空 如果(tail + 1) % data.length == front 则队列满
return front == tail;
}
/** * 入队 * * @param e */
@Override
public void enqueue(E e) {
//如果队列满 则扩容两倍
if ((tail + 1) % data.length == front) {
resize(getCapacity() * 2);
}
//把元素添加到队尾
data[tail] = e;
//队尾指针后移一位
tail = (tail + 1) % data.length;
size++;
}
/** * 扩容 * * @param newCapacity */
private void resize(int newCapacity) {
//新建一个指定容量的数组
E[] newData = (E[]) new Object[newCapacity + 1];
//把之前数组的元素复制到新数组
for (int i = 0; i < size; i++) {
//偏移量为front
newData[i] = data[(i + front) % data.length];
}
data = newData;
front = 0;
tail = size;
}
/** * 出队 * * @return */
@Override
public E dequeue() {
if (isEmpty()) {
throw new IllegalArgumentException("Cannot dequeue from an empty queue.");
}
//暂存出队元素
E e = data[front];
data[front] = null;
//头引用+1
front = (front + 1) % data.length;
size--;
//如果元素数量为容积的1/4 则缩容为原来的1/2
if (size == getCapacity() / 4 && getCapacity() / 2 != 0) {
resize(getCapacity() / 2);
}
return e;
}
/** * 获取队首元素 * * @return */
@Override
public E getFront() {
if (isEmpty()) {
throw new IllegalArgumentException("Queue is empty.");
}
return data[front];
}
@Override
public String toString() {
StringBuilder res = new StringBuilder();
res.append(String.format("Queue: size = %d , capacity = %d\n", size, getCapacity()));
res.append("Front [");
for (int i = front; i != tail; i = (i + 1) % data.length) {
res.append(data[i]);
if ((i + 1) % data.length != tail) {
res.append(", ");
}
}
res.append("] Tail");
return res.toString();
}
}
还没有评论,来说两句吧...