Java中的棧

學習了一段時間的JAVA,在這裏對最近幾回課程所學的 ‘ 棧 ’ 進行總結。java

 

關於棧

棧(Stack)是一種只能在一端進行插入和刪除操做的特殊線性表。數組

它具備 ‘ 後進先出(LIFO)’ 的特性。函數

以下圖,能夠把棧比做一個水桶 ,先放的東西在桶的底部,後放的東西在桶頂部。學習

而咱們查看和取出都只能對桶頂部的東西進行操做,若是我定義一個數組,那咱們只能先對數組的最後一個元素進行操做,例以下圖的a[6],而後才能往下取。測試

 

 

關於 Stack 類

Stack類繼承Vector類spa

下表是Stack類的幾種方法code

修飾語和類型 方法和說明
boolean empty()
          測試堆棧是否爲空。
E peek()
          查看堆棧頂部的對象,但不從堆棧中移除它。
E pop()
          移除堆棧頂部的對象,並做爲此函數的值返回該對象。
E push(E item)
          把項壓入堆棧頂部。
int search(Object o)
          返回對象在堆棧中的位置,以 1 爲基數。

 

 

 

 

 

 

 

 

 

 

實例

這裏我暫且用數組來實現棧對象

ps:我這裏用了java的泛型,關於java的泛型在上篇隨筆裏我有介紹。blog

 1 import java.util.Arrays;  2 
 3 public class Stack<E> {  4 
 5     // 新建一個長度爲0的數組
 6     private Object[] src = new Object[0];  7 
 8     // 將數據壓入棧
 9     public void push(E s) { 10         // 複製src數組,長度爲原數組的長度+1
11         E[] e = (E[]) Arrays.copyOf(src, src.length + 1); 12         // 將傳入的數據給新數組的最後一個元素
13         e[e.length - 1] = (E) s; 14         src = e; 15  } 16 
17     // 查看棧頂的數據
18     public E peek() { 19         // 判斷棧是否爲空
20         if (src.length == 0) { 21             return null; 22  } 23         // 返回src數組的最後一個元素
24         return (E) src[src.length - 1]; 25  } 26 
27     // 彈出棧頂的數據[移除]
28     public E pop() { 29         if (src.length == 0) { 30             return null; 31  } 32         // 將src數組複製給新數組,方便彈出棧頂的數據
33         E[] sr = (E[]) src; 34         E[] e = (E[]) Arrays.copyOf(src, src.length - 1); 35         src = e; 36         return (E) sr[sr.length - 1]; 37  } 38 
39     // 得到棧的長度
40     public int size() { 41         return src.length; 42  } 43 
44     // 判斷棧是否爲空
45     public boolean empty() { 46         return src.length == 0; 47  } 48 
49     public static void main(String[] args) { 50         Stack<String> st = new Stack<String>(); 51 
52         // 將數據壓入棧
53         st.push("AA"); 54         st.push("BB"); 55         st.push("CC"); 56         st.push("DD"); 57 
58         // 輸出棧頂數據
59         System.out.println("棧頂的數據爲:" + st.peek()); 60 
61         // 輸出棧的長度
62         System.out.println("棧的長度爲:" + st.size()); 63 
64         // 當棧不爲空時,彈出棧頂數據
65         while (!st.empty()) { 66             System.out.println("彈出數據:" + st.pop()); 67  } 68  } 69 }

 

運行結果:繼承

棧頂的數據爲:DD
棧的長度爲:4
彈出數據:DD
彈出數據:CC
彈出數據:BB
彈出數據:AA

 

結果分析

遵循了棧 ‘ 後進先出 ’ 的特性,輸入 AA、BB、CC、DD,彈出 DD、CC、BB、AA。

根據這個特性,棧在某些時候是必不可少的。

相關文章
相關標籤/搜索