天天看點

遞歸實作棧的翻轉遞歸實作棧的翻轉

遞歸實作棧的翻轉

 主要考察對于遞歸的了解,其實這個問題最簡單的方法當然是設計一個空的棧來存儲這些元素,一次達成逆序,但是題目要求使用遞歸的方式實作逆序,是以需要借助函數傳回棧來充當這個這個棧的作用,實際上依然是借助了一個棧,但是這個棧是函數幀上的棧。思路如下

  • 取出一個棧的最底下的那個元素,存放在函數幀中,也就是遞歸中的每層傳回值
  • 每次取出一個以後,逆序目前的剩餘棧,然後push剛才的那個值就可以逆序整個棧。
//這裡其實就是将棧頂元素取出放在函數棧中儲存下來,抽絲剝繭
//一次拿掉一個,直到最後一個得到傳回值,一次都傳回的同時,上面的那幾層
//都将原來自己儲存下來的值又放回棧裡面。
int getLastAndRemove(stack<int>& st){
    int result=st.top();
    st.pop();
    if(st.empty()){
        return result;
    }
    int last=getLastAndRemove(st);
    st.push(result);
    return last;
}
//每次尋找最下面的那個取出,前面的翻轉,遞歸基什麼都不做,完成棧的逆序。
void _reverse(stack<int>& st){
    if(st.empty())
        return;
    int i=getLastAndRemove(st);
    _reverse(st);
    st.push(i); 
}