队列是先进先出的线性表。在具体应用中通常使用链表或者数组来实现。队列只允许在后端进行入队操作(enqueue),在前端进行出队操作(dequeue)。如下图示例:
<图片来源于百度>
下面我们基于数组实现一个队列。
数组对象在之前的博客中已经讲过:封装自己的Array对象
1、队列接口
public interface Queue<E> { int getSize(); void enqueue(E e); E dequeue(); E getFront(); boolean isEmpty(); }
2、实现代码
public class ArrayQueue<E> implements Queue<E> { //自定义数组对象 private Array<E> array; //初始化 public ArrayQueue() { this(10); } public ArrayQueue(int capacity) { array = new Array<E>(capacity); } @Override public int getSize() { return array.getSize(); } @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 String toString() { StringBuilder str = new StringBuilder(); str.append(String.format("ArrayQueue: size=%d, capacity=%d ", array.getSize(), array.getCapacity())); str.append("front ["); for(int i = 0; i < array.getSize(); i++) { str.append(array.get(i)); if(i != array.getSize()-1) { str.append(","); } } str.append("]"); return str.toString(); } }
3、测试代码
public static void main(String[] args) { ArrayQueue<Integer> arrayQueue = new ArrayQueue<Integer>(); for (int i = 0; i < 12; i++) { arrayQueue.enqueue(i); System.out.println(arrayQueue); if(i % 3 == 2) {//每个3次入队,就出队一次 arrayQueue.dequeue(); System.out.println(arrayQueue); } } }
4、结果
ArrayQueue: size=1, capacity=10 front [0] ArrayQueue: size=2, capacity=10 front [0,1] ArrayQueue: size=3, capacity=10 front [0,1,2] ArrayQueue: size=2, capacity=10 front [1,2] ArrayQueue: size=3, capacity=10 front [1,2,3] ArrayQueue: size=4, capacity=10 front [1,2,3,4] ArrayQueue: size=5, capacity=10 front [1,2,3,4,5] ArrayQueue: size=4, capacity=10 front [2,3,4,5] ArrayQueue: size=5, capacity=10 front [2,3,4,5,6] ArrayQueue: size=6, capacity=10 front [2,3,4,5,6,7] ArrayQueue: size=7, capacity=10 front [2,3,4,5,6,7,8] ArrayQueue: size=6, capacity=10 front [3,4,5,6,7,8] ArrayQueue: size=7, capacity=10 front [3,4,5,6,7,8,9] ArrayQueue: size=8, capacity=10 front [3,4,5,6,7,8,9,10] ArrayQueue: size=9, capacity=10 front [3,4,5,6,7,8,9,10,11] ArrayQueue: size=8, capacity=10 front [4,5,6,7,8,9,10,11] ArrayQueue: size=3, capacity=10 front [9,10,11]
5、时间复杂度分析
在入队时,Array对象的底层是将新数据直接放到数组的末尾,时间复杂度为O(1);
在出队时,Array对象的底层是将数组首部元素移除,之后需要进行数组移位操作,因此时间复杂度为O(n);