Stack源碼解析
Stack介紹:
堆棧(Stack)是一個元素序列。盾戰中唯一能被刪除、訪問或修改的元素是最近插入的元素。這個元素就是位於堆棧頂部的那個元素。
舉例來說,自助餐廳的盤子架就是一個由盤子構成的堆棧。增加和移除操作只能在頂部進行。為了把它重新擺放,剛剛放到架子上的盤子將在下一次被移動。這種堆棧屬性的定義有時簡稱為“後進先出”,或者LIFO。和這種觀點相對應,我們把插入稱為壓棧(push),刪除稱為彈棧(pop)。為了逗以p字母開頭,我們把得到棧頂元素的操作稱為瀏覽(peek)。
public class Stack<E> extends Vector<E>;Stack類集成Vector,為了提高效率Stack對象的棧頂元素位於數組的size()-1索引位置,棧底位於索引0.Stack類的這種實現的致命缺點是:它並不禁止Vector類的任何方法,因此在一個Stack對象的任何位置插入、刪除都是合法的。想象下面這種情況:在Stack類中,調用了違反堆棧定義的方法居然是合法的!您也許會說這種實現有點過了頭。
Stack源碼解析:
1 package list.Stack; 2 3 import java.util.EmptyStackException; 4 import java.util.Vector; 5 6 public class Stack<E> extends Vector<E> { 7 /** 8 * 創建一個新的Stack. 9 */ 10 public Stack() { 11 } 12 13 // 在棧頂,也及時數組的末尾添加元素 14 public E push(E item) {15 addElement(item); 16 17 return item; 18 } 19 20 //刪除棧頂的元素,並返回該元素 21 public synchronized E pop() { 22 E obj; 23 int len = size(); 24 obj = peek(); 25 removeElementAt(len - 1); 26 return obj; 27 } 28 29 //瀏覽棧頂的元素 30 publicsynchronized E peek() { 31 int len = size(); 32 33 if (len == 0) 34 throw new EmptyStackException(); 35 return elementAt(len - 1); 36 } 37 38 //判斷堆棧中元素的數量是否為0 39 public boolean empty() { 40 return size() == 0; 41 } 42 43 //判斷堆棧中是否含有某個元素 44 public synchronized int search(Object o) { 45 int i = lastIndexOf(o); 46 47 if (i >= 0) { 48 return size() - i; 49 } 50 return -1; 51 } 52 53 private static final long serialVersionUID = 1224463164541339165L; 54 }
總結:
(01) Stack實際上也是通過數組去實現的。
執行push時(即,將元素推入棧中),是通過將元素追加的數組的末尾中。
執行peek時(即,取出棧頂元素,不執行刪除),是返回數組末尾的元素。
執行pop時(即,取出棧頂元素,並將該元素從棧中刪除),是取出數組末尾的元素,然後將該元素從數組中刪除。
(02) Stack繼承於Vector,意味著Vector擁有的屬性和功能,Stack都擁有。而且其實現壓棧(push),彈棧(pop)等操作也是調用了Vector類中的方法。
Stack示例:
1 package list.vector; 2 3 import java.util.Stack; 4 5 public class VectorDemo { 6 public static void main(String[] args) { 7 Stack<String> strs = new Stack<String>(); 8 //將0~9添加到堆棧中 9 for (int i = 0; i < 10; i++) { 10 strs.push(i+""); 11 } 12 //遍歷堆棧 13 //for循環快速遍歷 14 for (int i = 0; i < strs.size(); i++) { 15 System.out.print(strs.get(i)); 16 } 17 System.out.println(); 18 System.out.println("------1-----" ); 19 //棧彈出遍歷方式 20 // while (s.peek()!=null) { //不健壯的判斷方式,容易拋異常,正確寫法是下面的 21 while (!strs.empty()) { 22 System.out.print(strs.pop()); 23 } 24 System.out.println(); 25 System.out.println("------2-----" ); 26 } 27 }
運行結果:
0123456789 ------1----- 9876543210 ------2-----
寫在最後:
此篇隨筆僅用來記錄我的學習內容,如有錯誤,歡迎指正。謝謝!!!
Stack源碼解析