Java提高篇(三一)-----Stack


在Java中Stack類表示后進先出(LIFO)的對象堆棧。棧是一種非常常見的數據結構,它采用典型的先進后出的操作方式完成的。每一個棧都包含一個棧頂,每次出棧是將棧頂的數據取出,如下:

2014070800001_thumb_thumb

Stack通過五個操作對Vector進行擴展,允許將向量視為堆棧。這個五個操作如下:

            操作                                           說明

empty()

測試堆棧是否為空。

peek()

查看堆棧頂部的對象,但不從堆棧中移除它。

pop()

移除堆棧頂部的對象,並作為此函數的值返回該對象。

push(E item)

把項壓入堆棧頂部。

search(Object o)

返回對象在堆棧中的位置,以 1 為基數。

Stack繼承Vector,他對Vector進行了簡單的擴展:

public class Stack<E> extends Vector<E>

  Stack的實現非常簡單,僅有一個構造方法,五個實現方法(從Vector繼承而來的方法不算與其中),同時其實現的源碼非常簡單

/**
     * 構造函數
     */
    public Stack() {
    }
</span><span style="color: rgb(0,128,0)">/**</span><span style="color: rgb(0,128,0)">
 *  push函數:將元素存入棧頂
 </span><span style="color: rgb(0,128,0)">*/</span>
<span style="color: rgb(0,0,255)">public</span><span style="color: rgb(0,0,0)"> E push(E item) {
    </span><span style="color: rgb(0,128,0)">//</span><span style="color: rgb(0,128,0)"> 將元素存入棧頂。
    </span><span style="color: rgb(0,128,0)">//</span><span style="color: rgb(0,128,0)"> addElement()的實現在Vector.java中</span>

addElement(item);

    </span><span style="color: rgb(0,0,255)">return</span><span style="color: rgb(0,0,0)"> item;
}

</span><span style="color: rgb(0,128,0)">/**</span><span style="color: rgb(0,128,0)">
 * pop函數:返回棧頂元素,並將其從棧中刪除
 </span><span style="color: rgb(0,128,0)">*/</span>
<span style="color: rgb(0,0,255)">public</span> <span style="color: rgb(0,0,255)">synchronized</span><span style="color: rgb(0,0,0)"> E pop() {
    E    obj;
    </span><span style="color: rgb(0,0,255)">int</span>    len =<span style="color: rgb(0,0,0)"> size();

    obj </span>=<span style="color: rgb(0,0,0)"> peek();
    </span><span style="color: rgb(0,128,0)">//</span><span style="color: rgb(0,128,0)"> 刪除棧頂元素,removeElementAt()的實現在Vector.java中</span>
    removeElementAt(len - 1<span style="color: rgb(0,0,0)">);

    </span><span style="color: rgb(0,0,255)">return</span><span style="color: rgb(0,0,0)"> obj;
}

</span><span style="color: rgb(0,128,0)">/**</span><span style="color: rgb(0,128,0)">
 * peek函數:返回棧頂元素,不執行刪除操作
 </span><span style="color: rgb(0,128,0)">*/</span>
<span style="color: rgb(0,0,255)">public</span> <span style="color: rgb(0,0,255)">synchronized</span><span style="color: rgb(0,0,0)"> E peek() {
    </span><span style="color: rgb(0,0,255)">int</span>    len =<span style="color: rgb(0,0,0)"> size();

    </span><span style="color: rgb(0,0,255)">if</span> (len == 0<span style="color: rgb(0,0,0)">)
        </span><span style="color: rgb(0,0,255)">throw</span> <span style="color: rgb(0,0,255)">new</span><span style="color: rgb(0,0,0)"> EmptyStackException();
    </span><span style="color: rgb(0,128,0)">//</span><span style="color: rgb(0,128,0)"> 返回棧頂元素,elementAt()具體實現在Vector.java中</span>
    <span style="color: rgb(0,0,255)">return</span> elementAt(len - 1<span style="color: rgb(0,0,0)">);
}

</span><span style="color: rgb(0,128,0)">/**</span><span style="color: rgb(0,128,0)">
 * 棧是否為空
 </span><span style="color: rgb(0,128,0)">*/</span>
<span style="color: rgb(0,0,255)">public</span> <span style="color: rgb(0,0,255)">boolean</span><span style="color: rgb(0,0,0)"> empty() {
    </span><span style="color: rgb(0,0,255)">return</span> size() == 0<span style="color: rgb(0,0,0)">;
}

</span><span style="color: rgb(0,128,0)">/**</span><span style="color: rgb(0,128,0)">
 *  查找“元素o”在棧中的位置:由棧底向棧頂方向數
 </span><span style="color: rgb(0,128,0)">*/</span>
<span style="color: rgb(0,0,255)">public</span> <span style="color: rgb(0,0,255)">synchronized</span> <span style="color: rgb(0,0,255)">int</span><span style="color: rgb(0,0,0)"> search(Object o) {
    </span><span style="color: rgb(0,128,0)">//</span><span style="color: rgb(0,128,0)"> 獲取元素索引,elementAt()具體實現在Vector.java中</span>
    <span style="color: rgb(0,0,255)">int</span> i =<span style="color: rgb(0,0,0)"> lastIndexOf(o);

    </span><span style="color: rgb(0,0,255)">if</span> (i &gt;= 0<span style="color: rgb(0,0,0)">) {
        </span><span style="color: rgb(0,0,255)">return</span> size() -<span style="color: rgb(0,0,0)"> i;
    }
    </span><span style="color: rgb(0,0,255)">return</span> -1<span style="color: rgb(0,0,0)">;
}</span></pre>

Stack的源碼很多都是基於Vector,所以這里不再累述,更多詳情請參考:Java提高篇(二九)-----Vector


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM