學習了一段時間的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。
根據這個特性,棧在某些時候是必不可少的。