【Java集合的詳細研究9】Java堆棧(stack)的使用方法


棧是一種常用的數據結構,棧只允許訪問棧頂的元素,棧就像一個杯子,每次都只能取杯子頂上的東西,而對於棧就只能每次訪問它的棧頂元素,
從而可以達到保護棧頂元素以下的其他元素.”先進后出”或”后進先出”就是棧的一大特點,
先進棧的元素總是要等到后進棧的元素出棧以后才能出棧.遞歸就是利用到了系統棧,暫時保存臨時結果,對臨時結果進行保護.

棧是存放基本類型的變量數據和對象的引用,但對象本身不存放在棧中,而是存放在堆(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.

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM