菜鸟刷题之路——Q24:递归反转栈

问题

只用递归实现一个栈的翻转,假设栈存储的内容是整数类型。
问题来自面试,主要是考量思想。

分析

分析:递归本身是调用系统栈,我们以1->2->3->4->5这个序列为例子,实现翻转需要两个过程:

  • 弹出当前栈底元素,保存下来,并保持其他元素的位置不动。此时栈的大小是在不断变小的;
  • 不断取出栈底元素直到栈空,此时我们取出的顺序是:1,2,3,4,5。我们只需要再递归地把它们压入栈就实现了栈的翻转。

Code

// 弹出栈底元素,并保持其他元素位置不动    
public  int getLastElements(Stack<Integer> stack) {
        int num = stack.pop();
        if (stack.isEmpty()) return num;
    // 如果不是栈底,就递归,并在递归返回时把弹出的值压回去
        int res = getLastElements(stack);
        stack.push(num);
        return res;
    }
    public  void reverse(Stack<Integer> stack) {
        if (stack.isEmpty()) return;
        // 获取了当前位置的栈的栈底元素,这个元素被保存在i变量中,被压入了JVM的系统栈中
        int i = getLastElements(stack);
        // 此时又发生了递归,注意这里我们并没有把栈底元素压入栈,相当于把原栈的栈底元素弹出,而其他位置不变。此时不断递归,当只剩一个元素,且被弹出后栈为空,则递归开始返回
        reverse(stack);
        // 由之前的描述我们可以知道,最后一次递归的i是原栈的栈顶元素5,此时栈为空,压入栈即为栈底,递归不断返回则最后的序列为5->4->3->2->1.
        stack.push(i);
    }
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值