1. 程式人生 > >只使用遞歸實現棧的逆序操作

只使用遞歸實現棧的逆序操作

可能 top push div emp return 遞歸實現 開始 stack

2017-06-23 20:36:02

剛開始思考這個問題的時候陷入了一個誤區,就是以為只能用一個遞歸完成。

然而事實上,可以使用兩個遞歸來完成這個功能。

具體思考是這樣的,首先遞歸其實是將問題規模縮小了,每次處理更小的問題。針對這題來說,更小的問題應該是去除底部那個數後的逆序再加上最後的數。

當然,你可能會問,什麽不是去掉最上面的數,然後將它再放到最前面,理由很簡單,棧是一種後進先出的數據結構,這種類型的數據結構適合的是在尾部添加數據,而非在首部添加數據,所以更清晰的或者說更適合棧的操作是先把底部數據remove,再對棧進行逆序操作,最後將它再push進末尾。

因此,核心操作就兩個,一個是remove底部數據,二是reverse。

int getlast(stack<int>& s)
{
    if(s.empty()) {cout<<"當前棧為空"<<endl;exit(0);}
    else
    {
        int temp=s.top();
        s.pop();
        if(s.empty()) return temp;
        else
        {
            int t=getlast(s);
            s.push(temp);
            return t;
        }
    }
}

void reverse(stack<int>& s) { if(s.empty()) return ; else { int temp=getlast(s); reverse(s); s.push(temp); } }

只使用遞歸實現棧的逆序操作