- 一种线性结构
- 相比数组,队列的操作时数组操作的子集
- 只能从一段(队尾)添加元素,只能从另一端(队首)取出元素
- 一种先进先出的数据结构 First In First Out (FIFO)
队列的实现
Queue
- void enqueue(E) O(1) 均摊
- E dequeue() O(n)
- E getFront() O(1)
- int getSize() O(1)
- boolean isEmpty() O(1)
循环队列
- 相比普通队列,循环队列的出队时间复杂度降为O(1) 均摊。
- 入队
public void enqueue (E e){
if ((tail + 1) % data.length == front) // 队列已满
resize(getCapacity()*2); // 扩容操作
data[tail] = e;
tail = (tail + 1) % data.length;
size++;
}
private void resize(int newCapacity){
E[] newData = (E[]) new Object[newCapacity + 1]
for(int i=0; i<size; i++)
newData[i] = data[(i + front) % data.length];
data = newData;
front = 0;
tail = size;
}
- 出队
public E dequeue(){
if (isEmpty())
throw new IllegalArgumentException("Cannot dequeue from an empty queue");
E ret = data[front];
data[front] = null;
front = (front + 1) % data.length;
size--;
if (size == getCapacity / 4 && getCapacity() / 2 != 0) // 缩容操作
resize(getCapacity() / 2);
return ret;
}