给定一个栈,仅利用栈自身的结构逆序栈,不能借助其它数据结构

不借助其它数据结构,仅使用给的一个栈实现栈的逆序,听起来不可思议!其实是可以借助递归时系统压栈的方式(即栈帧存储数据)来实现逆序.

操作:

1.使用 f() 函数每次抽取出栈底的元素且弹出,那么就可以将栈中所有的元素按逆序的方式拿到 2.reverse() 函数也利用系统压栈,当达到调用链尽头,这时栈帧中p变量存储的就是原来栈顶的元素,并且此时栈已经空了(因为栈为空是 base case 即:终止条件),那么压栈返回,压栈返回... 就会将栈逆序.

小结: 虽然在代码层面并没有利用给定栈的其它数据结构辅助,但是利用了代码执行过程中系统压栈的过程. 在系统层面,方法每向下调用一次,就会压一次栈,对应的是JVM的栈帧.

拿递归来说,在未达到base case之前就会一直有新的栈帧生成,当最后一个栈帧执行完毕,在有返回的情况下,会返回到它的调用者(如下int last = f(stack) 就会将f(stack)的返回给上层的last),后续代码执行完毕就会销毁栈帧 ... 执行完毕.

public static void reverse(Stack<Integer> stack){
        if (stack.empty()){
            return;
        }
        int p = f(stack);
        reverse(stack);
        stack.push(p);
    }
    
    //抽底操作 需要一种机制将下层抓到的底向上返回
    public static int f(Stack<Integer> stack){
        int res = stack.pop();
        if(!stack.empty()){
            int last = f(stack);
            stack.push(res);
            return last;
        }else{
            return res;
        }
    }

 左神算法学习

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值