數據結構—隊列

概述:實現一個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;
        }
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章