Stack源碼解析

Stack介紹:

  堆棧(Stack)是一個元素序列。盾戰中惟一能被刪除、訪問或修改的元素是最近插入的元素。這個元素就是位於堆棧頂部的那個元素。java

  舉例來講,自助餐廳的盤子架就是一個由盤子構成的堆棧。增長和移除操做只能在頂部進行。爲了把它從新擺放,剛剛放到架子上的盤子將在下一次被移動。這種堆棧屬性的定義有時簡稱爲「後進先出」,或者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 }

總結spa

(01) Stack實際上也是經過數組去實現的。
       執行push時(即,將元素推入棧中),是經過將元素追加的數組的末尾中。
       執行peek時(即,取出棧頂元素,不執行刪除),是返回數組末尾的元素。
       執行pop時(即,取出棧頂元素,並將該元素從棧中刪除),是取出數組末尾的元素,而後將該元素從數組中刪除。
(02) Stack繼承於Vector,意味着Vector擁有的屬性和功能,Stack都擁有。並且其實現壓棧(push),彈棧(pop)等操做也是調用了Vector類中的方法。code

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-----

 

寫在最後:
  此篇隨筆僅用來記錄個人學習內容,若有錯誤,歡迎指正。謝謝!!!blog

相關文章
相關標籤/搜索