在Java中Stack類表示后進先出(LIFO)的對象堆棧。棧是一種非常常見的數據結構,它采用典型的先進后出的操作方式完成的。每一個棧都包含一個棧頂,每次出棧是將棧頂的數據取出,如下:
Stack通過五個操作對Vector進行擴展,允許將向量視為堆棧。這個五個操作如下:
操作 | 說明 |
|
測試堆棧是否為空。 |
|
查看堆棧頂部的對象,但不從堆棧中移除它。 |
|
移除堆棧頂部的對象,並作為此函數的值返回該對象。 |
|
把項壓入堆棧頂部。 |
|
返回對象在堆棧中的位置,以 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 >= 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