只用递归翻转栈

先说句题外话,用递归实现栈的翻转纯粹就是用来练习的,递归做的效率显然不是最好的。面试喜欢问这个问题目的也就是考察对递归的理解。

另外,不可能不用额外空间。递归就需要压栈,压栈就需要空间。

做法:

  1. 取出栈顶
  2. 翻转栈
  3. 把第1步取出的元素放到栈底

其中2,3两步就可以用递归做。

参考程序(可编译):

#include <iostream>
#include <stack>
using namespace std;

class ReverseStack {
public:
    void reverseStackRecursively(stack& stk) {
        if (stk.empty()) return;
        reverse_stk(stk);
    }
private:
    void reverse_stk(stack& stk) {
        if (stk.empty()) return;
        int top_val = stk.top(); stk.pop();
        reverse_stk(stk);
        insert_to_bottom(stk, top_val);
    }
    
    void insert_to_bottom(stack& stk, int val) {
        if (stk.empty()) {
            stk.push(val);
            return;
        }
        int top_val = stk.top(); stk.pop();
        insert_to_bottom(stk, val);
        stk.push(top_val);
    }
};

int main()
{
    stack stk;
    for (int i = 5; i >= 1; i--) {
        stk.push(i);
    }
    ReverseStack rs;
    rs.reverseStackRecursively(stk);
    while (!stk.empty()) {
        cout << stk.top() << " ";
        stk.pop();
    }
}

转载于:https://www.cnblogs.com/ilovezyg/p/6901298.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值