使用兩個stack對一個stack的內容進行反轉
阿新 • • 發佈:2019-02-01
辦法一(只採用一個stack), 通過遞迴實現:
上述演算法中, 遞迴玩之後有進入下一個遞迴, 將elements 放在stack中。// http://w...content-available-to-author-only...s.org/reverse-a-stack-using-recursion/ #include<iostream> #include<stack> using namespace std; void printStack(stack<int> st) { while(!st.empty()){ cout<<st.top()<<" "; st.pop(); } cout<<endl; } //遞迴插入 void insertAtBottom(stack<int> &st, int data) { if( (st.empty()) ){ st.push(data); } else { int temp = st.top(); st.pop(); insertAtBottom(st, data); st.push(temp); } } void reverseStack(stack<int> &st) { if( !(st.empty()) ) { int temp = st.top(); st.pop(); reverseStack(st); insertAtBottom(st, temp); } } int main() { stack<int> st ; st.push(4); st.push(3); st.push(2); st.push(1); printStack(st); reverseStack(st); printStack(st); return 0; }
具體如下, 以4, 3, 2, 1順序入棧:
reverseStack(1234) :
temp = 1, reverseStack(234), 進入下一下function stack: temp = 2, reverseStack(34), 進入下一個stack frame: temp = 3, reverseStack(4), 接下來, temp = 4, reverse(empty), 接下來, 逐次放回上次遞迴呼叫。 insertAtBottom(st, 4), 由於st此時為空的, 直接入棧st = 4, 接下來, 返回上一層遞迴呼叫, insertAtBottom(st, 3), 由於此時st不為空, 所以4出棧, 變為空, 3入棧, 返回上一層, 4入棧, 這樣st就變成了: st = 43, 一次類推, 最終, st = 4321, 這樣就利用stack frame, 只需要一個stack就實現了反轉了。
方法二: 現在當有兩個stack的時候, A, B, 我們只需要採用遞迴的辦法, 把A的內容複製到B中, 然後在將B的內容pop到A中, 即可實現反轉了。
程式如下:
#include<iostream> #include<stack> using namespace std; void printStack(stack<int> st) { while(!st.empty()){ cout<<st.top()<<" "; st.pop(); } cout<<endl; } void reverseStack(stack<int> &st, stack<int> &st2) { if( !(st.empty()) ) { int temp = st.top(); st.pop(); reverseStack(st, st2); st2.push(temp); } } int main() { stack<int> st, st2; st.push(4); st.push(3); st.push(2); st.push(1); printStack(st); reverseStack(st, st2); printStack(st); while(!st2.empty()) { st.push(st2.top()); st2.pop(); } printStack(st); return 0; }
執行如下: