遞歸實作棧的翻轉
主要考察對于遞歸的了解,其實這個問題最簡單的方法當然是設計一個空的棧來存儲這些元素,一次達成逆序,但是題目要求使用遞歸的方式實作逆序,是以需要借助函數傳回棧來充當這個這個棧的作用,實際上依然是借助了一個棧,但是這個棧是函數幀上的棧。思路如下
- 取出一個棧的最底下的那個元素,存放在函數幀中,也就是遞歸中的每層傳回值
- 每次取出一個以後,逆序目前的剩餘棧,然後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);
}