1. 前言
上文我們用環形單向鏈表實現了隊列.接下來我們用環形數組來模擬隊列.并實現了isFull(),isEmpty()等方法.
2. 環形數組模擬隊列
(1). Queue接口 :?
public interface Queue<E> {//向隊伍插入值, 插入成功返回true, 否則返回falseboolean offer(E value);//對隊頭獲取值, 但不移除E poll();//從隊頭獲取值, 并移除隊頭E peek();//判斷隊伍是否為空boolean isEmpty();//判斷隊列是否已滿boolean isFull();
}
(2). 環形數組模擬隊列
public class ArrayQueue<E> implements Queue<E>, Iterable<E>{//數組的容量private int capacity;//環形數組private E[] queue;//隊頭private int head = 0;//隊尾private int tail = 0;public ArrayQueue() {capacity = 10;}public ArrayQueue(int capacity) {this.capacity = capacity;//數組capacity個位置存儲數據, 剩下一個位置用來區分隊伍是滿了還是空了的情況queue = (E[]) new Object[capacity + 1];}@Overridepublic boolean offer(E value) {//如果隊伍已經滿了, 那么添加元素失敗if(isFull()) {return false;}queue[tail] = value;tail = (tail + 1) % queue.length;return true;
}@Overridepublic E poll() {//如果隊列為空, 那么返回nullif(isEmpty()) {return null;}return queue[head];}@Overridepublic E peek() {//如果隊列為空, 那么返回nullE value = queue[head];head = (head + 1) % queue.length;return value;}@Overridepublic boolean isEmpty() {return head == tail;}@Overridepublic boolean isFull() {//數組的長度queue.length并不等于數組的容量capacityreturn (tail+1) % queue.length == head;}@Overridepublic Iterator<E> iterator() {return new Iterator<E>() {int p = head;@Overridepublic boolean hasNext() {return p != tail;}@Overridepublic E next() {E value = queue[p];p++;return value;}};}
}
3. 單元測試
public class ArrayQueueTest {@Testpublic void test() {ArrayQueue<Integer> queue = new ArrayQueue<>(5);queue.offer(1);queue.offer(2);queue.offer(3);queue.offer(4);queue.offer(5);
// for (Integer element : queue) {
// System.out.print(element);
// }//12345System.out.println(queue.poll());//1System.out.println(queue.peek());//1System.out.println(queue.poll());//2}
}