棧的倒置(遞歸法)


 

 

將棧中的元素倒置,一種最簡單的辦法是利用數組存儲棧彈出的元素,而后再壓入棧中,空間復雜度O(N),時間復雜度O(2N)。

 

另一種方法是利用遞歸將棧中的元素倒置。

假設原棧中的元素為

5(5在棧頂)

4

3

2

1

那么倒置后棧中的元素應為

1

2

3

4

5

 

如果已經將1,2倒置了,即棧中的元素為

1

2

如何將3壓入棧低,可以先將1、2彈出,而后壓入3,再依次壓入2,1.

實現代碼如下

    private static void push(Stack<Integer> st, int data) {
        if (st.isEmpty()) {
            st.push(data);
            return;
        }
        int temp = st.pop();
        push(st, data);
        st.push(temp);
    }

 

所以對於整個棧的實現為
將1壓入棧底;

將1彈出,將2壓入棧底,再將1壓入棧

將1、2彈出,將3壓入棧底,再依次壓入2、1

將1、2、3彈出,將4壓入棧底,再依次壓入3、2、1.

 

 

實現代碼如下

    private static void push(Stack<Integer> st, int data) {
        if (st.isEmpty()) {
            st.push(data);
            return;
        }
        int temp = st.pop();
        push(st, data);
        st.push(temp);
    }

    public static void reverseStack(Stack<Integer> st) {
        if (st.isEmpty()) return;
        int temp = st.pop();
        reverseStack(st);
        push(st, temp);
    }

 

復雜度分析

空間復雜度是O(N),不是O(1),這時由於遞歸函數reverseStack每次調用時都會產生變量temp=st.pop(),這些變量會存儲在棧中,同樣占用空間。

 

時間復雜度是O(N^2)

每次調用push()函數,都會將棧中的元素彈出,在壓入,這個過程會進行N次。

 

故棧的倒置,最簡單的數組法,也是復雜度最低的。

 


免責聲明!

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



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