栈--原地reverse栈

Posted swifthao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了栈--原地reverse栈相关的知识,希望对你有一定的参考价值。

思路

不用其他数据结构,用递归实现原地逆置

需要设计两个递归函数:

  • 递归函数1:将栈底元素返回并且移除
  • 递归函数2:使用到函数1的reverse方法

代码

class StackReverse {
    public int getAndRemoveLastElement(Stack<Integer> stack){
        int top = stack.pop();//注意这里是pop,不是peek
        if (stack.empty()){
            return top;
        }else {
            int result = getAndRemoveLastElement(stack);
            stack.push(top);
            return result;
        }
    }

    public void reverse(Stack<Integer> stack){
        if (stack.empty()){
            return;
        }else {
            int ans = getAndRemoveLastElement(stack);
            reverse(stack);
            stack.push(ans);
        }
    }

    public static void main(String[] args) {
        Stack<Integer> stack = new Stack<>();
        stack.push(3);
        stack.push(2);
        stack.push(1);
//        for (Integer i:stack) {
//            System.out.println(i);
//        }
        StackReverse solution = new StackReverse();
        solution.reverse(stack);
        while (!stack.empty()){
            System.out.println(stack.pop());//结果为3,2,1;说明已经成功reverse栈
        }
    }
}

执行流程分析

  • getAndRemoveLastElement函数执行流程

    首先从栈顶到栈尾,元素分别是1,2,3.对于getAndRemoveLastElement函数(以下简称get)。第一次调用get函数时,top=1,并且将1出栈,栈内元素为2,3 。接着第二次调用get 函数,top=2,将2出栈,栈内元素为3 。接着第三次调用get函数,top=3,将3出栈,栈内元素为空,此时满足if判断(递归终止条件),第三次get函数return 3,跳出第三次调用的get函数。回到第二次调用的get函数,result等于第三次get函数return的值3,此时top=2,将2压入栈,return result(3)。此时第二次get函数结束,跳到了第一次get函数,此时top=1,result等于第二次get函数return的值3,将top=1压入栈,return result(3),至此,所有的get函数全部跳出,“pop”出了栈底元素3,其他元素“不变”

  • reverse函数执行流程

    第一次调用reverse函数,ans=栈底元素3,并且将3出栈,进入第二次调用的reverse函数。第二次调用的reverse函数,ans=2,并且将2出栈,进入第三次调用的reverse函数。第三次调用的reverse函数,ans=1,并且将1出栈,进入到第四次reverse函数。第四次reverse函数,stack为空,return;(递归终止条件),跳出第四次reverse,进入到第三次reverse,此时ans=1,将1push到栈中,跳出第三次reverse ... 最后栈内元素成功reverse掉

以上是关于栈--原地reverse栈的主要内容,如果未能解决你的问题,请参考以下文章

[Daily]仅用递归函数和栈操作逆序一个栈

leetcode栈--1evaluate-reverse-polish-notation(逆波兰表达式)

全栈编程系列SpringBoot整合Shiro(含KickoutSessionControlFilter并发在线人数控制以及不生效问题配置启动异常No SecurityManager...)(代码片段

150. Evaluate Reverse Polish Notation

回栈事务后如何持久化分片数据?

python全栈脱产第37天------进程池与线程池协程gevent模块单线程下实现并发的套接字通信