概述:實現一個FIFO(先進先出)的隊列
實現思路:
同樣可以用數組和鏈表來實現:用數組實現隊列的弊端和用數組實現棧的弊端是類似的,不再贅述;用鏈表實現,通過在尾節點添加元素實現往隊列添加元素,通過從頭節點刪除一個元素實現從隊列刪除元素,添加和刪除隊列中的元素的效率和隊列數據大小無關。
注意:用鏈表實現隊列的時候,另一種方式是和上面剛好相反:在頭節點添加數據,而在尾節點刪除數據。由於我們使用的是單鏈表,這樣做的問題是每次刪除一個元素都要遍歷整個鏈表,導致刪除操作的效率低下。
實現:
public class MyQueue<T> {
/**
* 節點類
*/
private class Node<T> {
T node;
Node<T> next;
Node(T node) {
this.node = node;
}
}
/**
* 頭節點
*/
private Node<T> first;
/**
* 尾節點
*/
private Node<T> last;
/**
* 隊列大小
*/
private int size = 0;
/**
* 判斷隊列是否爲空
*
* @return 隊列是否爲空,爲空返回true,否則false
*/
public boolean isEmpty() {
return size == 0;
}
/**
* 返回隊列大小
*
* @return 隊列大小
*/
public int size() {
return size;
}
/**
* 向隊列中加入一個元素(加入到隊列尾部)
*
* @param 需加入隊列的元素
*/
public void enQueue(T node) {
Node<T> oldLast = last;
last = new Node<T>(node);
last.next = null;
if (size == 0) {
first = last;
} else {
oldLast.next = last;
}
size++;
}
/**
* 從隊列中移除一個元素(移除頭節點)
*
* @return 當前隊列尾部元素
*/
public T deQueue() {
if (size > 0) {
T result = first.node;
first = first.next;
size--;
return result;
} else {
return null;
}
}
}