棧是一種常用的數據結構,棧只允許訪問棧頂的元素,棧就像一個杯子,每次都只能取杯子頂上的東西,而對於棧就只能每次訪問它的棧頂元素,
從而可以達到保護棧頂元素以下的其他元素.”先進后出”或”后進先出”就是棧的一大特點,
先進棧的元素總是要等到后進棧的元素出棧以后才能出棧.遞歸就是利用到了系統棧,暫時保存臨時結果,對臨時結果進行保護.
棧是存放基本類型的變量數據和對象的引用,但對象本身不存放在棧中,而是存放在堆(new 出來的對象)或者常量池中(字符串常量對象存放在常量池中。)。
棧和常量池中的對象可以共享,對於堆中的對象不可以共享。棧中的數據大小和生命周期是可以確定的,當沒有引用指向數據時,這個數據就會消失。堆中的對象的由垃圾回收器負責回收,因此大小和生命周期不需要確定。局部變量的數據存在於棧內存中。棧的優勢是,存取速度比堆要快,僅次於寄存器,棧數據可以共享。但缺點是,存在棧中的數據大小與生存期必須是確定的,缺乏靈活性。棧中主要存放一些基本類型的變量數據(int, short, long, byte, float, double, boolean, char)和對象句柄(引用)。
堆棧是一種 “后進先出” (LIFO) 的數據結構, 只能在一端進行插入(稱為 “壓棧” ) 或刪除 (稱為“出棧”)數據的操作。
JAVA 中,使用 java.util.Stack 類的構造方法創建對象。
public class Stack extends vector
構造方法 : public Stack() 創建一個空 Stack。
方法: 1. public push (item ) 把項 壓入棧頂。其作用與 addElement (item ) 相同。
參數 item 壓入棧頂的項 。 返回: item 參數 ;
2. public pop () 移除棧頂對象,並作為函數的值 返回該對象。
返回:棧頂對象(Vector 對象的中的最后一項)。
拋出異常 : EmptyStackException 如果堆棧式空的 。。。
3. public peek() 查看棧頂對象而不移除它。。
返回:棧頂對象(Vector 對象的中的最后一項)。
拋出異常 : EmptyStackException 如果堆棧式空的 。。。
4. public boolean empty (測試堆棧是否為空。) 當且僅當堆棧中不含任何項時 返回 true,否則 返回 false.
5. public int search (object o) 返回對象在堆棧中位置, 以 1 為基數, 如果對象 o是棧中的一項,該方法返回距離 棧頂最近的出現位置到棧頂的距離; 棧中最上端項的距離
//棧,Vector的子類 public class StackDemo { // 把元素放入棧頂 static void showpush(Stack st, int a) { st.push(new Integer(a)); System.out.println("push(" + a + ")"); System.out.println("stack: " + st); } // 從棧頂刪除元素 static void showpop(Stack st) { System.out.print("pop -> "); // 判斷棧是否為空 if (st.empty()) { System.out.println("Stack is empty."); } else { Integer a = (Integer) st.pop(); System.out.println(a); System.out.println("stack: " + st); } } // 查看棧頂元素 static void showpeek(Stack st) { System.out.print("peek -> "); if (st.empty()) { System.out.println("Stack is empty."); } else { Integer a = (Integer) st.peek(); System.out.println(a); System.out.println("stack: " + st); } } // 查詢指定元素 static void showsearch(Stack st, int i) { System.out.print("search -> " + i); Integer index = (Integer) st.search(i); System.out.println("--index -> " + index); System.out.println("stack: " + st); } public static void main(String args[]) { Stack st = new Stack(); System.out.println("stack: " + st); showpush(st, 42); showpush(st, 66); showpeek(st); showsearch(st, 66); showsearch(st, 88); showpop(st); showpop(st); showpop(st); } }
運行結果:
stack: []
push(42)
stack: [42]
push(66)
stack: [42, 66]
peek -> 66
stack: [42, 66]
search -> 66--index -> 1
stack: [42, 66]
search -> 88--index -> -1
stack: [42, 66]
pop -> 66
stack: [42]
pop -> 42
stack: []
pop -> Stack is empty.