数组队列
队列也是一种线性的结构。基于Array实现队列,每当取出队首,其他元素要依次前移。
相比数组,队列对应的操作是数组的子集
队列只能一头进添加(队尾)、另一头出取出(队首),与现实中银行办事情的队伍是一样的。
队列是一种先到先得的结构,First In First Out (FIFO)
队列接口的抽象方法
Queue
void enqueue(E) 入队列(添加到队尾)
E dequeue() 出队(从队首取出一个元素,其他元素依次往前走)
E getFront() 查看队首元素
int getSize() 查看队列中的有效元素个数
boolean isEmpty() 队列是否为空
队列的方法与栈的对应,功能很相似。
数组队列的实现
Interface Queue <----- ArrayQueue
ArrayQueue将复用动态数组类Array,所以在ArrayQueue中要new一个Array,来对其进行操作
public class ArrayQueue<E> implements Queue<E>{
Array<E> array;
public ArrayQueue(int capacitiy) {
array = new Array<>(capacitiy);
}
public ArrayQueue() {
array = new Array<>();
}
@Override
public void enQueue(E e) {
array.addLast(e);
}
@Override
public E deQueue() {
return array.removeFirst();
}
@Override
public E getFront() {
return array.getFirst();
}
@Override
public boolean isEmpty() {
return array.isEmpty();
}
@Override
public int getSize() {
return array.getSize();
}
public int getCapacity() {
return array.getCapactiy();
}
@Override
public String toString() {
StringBuilder ret = new StringBuilder();
ret.append("Queue : front [");
for (int i = 0; i < array.getSize(); i ++) {
String val = String.valueOf(array.get(i));
if (i != array.getSize() -1) {
ret.append( val + ", ");
}else {
ret.append(val + "] tail. Size: " + String.valueOf(array.getSize()) + " capacity: " + String.valueOf(array.getCapactiy()));
}
}
return ret.toString();
}
public static void main(String[] args) {
// write your code here
ArrayQueue<Integer> arrayQueue = new ArrayQueue<>();
arrayQueue.enQueue(1);
arrayQueue.enQueue(2);
arrayQueue.enQueue(3);
System.out.println(arrayQueue);
arrayQueue.deQueue();
System.out.println(arrayQueue);
}
}
运行结果:
Queue : front [1, 2, 3] tail. Size: 3 capacity: 10
Queue : front [2, 3] tail. Size: 2 capacity: 10
数组队列的复杂度分析
Queue
void enqueue(E) 均摊O(1)
E dequeue() O(n)
E getFront() O(1)
int getSize() O(1)
boolean isEmpty() O(1)
待优化
Queue
E dequeue() O(n)
出队的复杂度可以进一步优化
每当有元素出队,其他元素不移动,可以使复杂度降低
这就是下一节的循环队列