1. 程式人生 > >Stack源碼解析

Stack源碼解析

public syn 開頭 sync sys 彈出 for循環 last -s

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 public
synchronized 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源碼解析