將棧中的元素倒置,一種最簡單的辦法是利用數組存儲棧彈出的元素,而后再壓入棧中,空間復雜度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次。
故棧的倒置,最簡單的數組法,也是復雜度最低的。