1. 程式人生 > >使用兩個stack對一個stack的內容進行反轉

使用兩個stack對一個stack的內容進行反轉

辦法一(只採用一個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;
}
 
上述演算法中, 遞迴玩之後有進入下一個遞迴, 將elements 放在stack中。
具體如下, 以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;
}

執行如下: