码迷,mamicode.com
首页 > 其他好文 > 详细

栈--原地reverse栈

时间:2020-04-26 01:43:48      阅读:60      评论:0      收藏:0      [点我收藏+]

标签:code   ast   str   方法   integer   for   条件   流程分析   ack   

思路

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

需要设计两个递归函数:

  • 递归函数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栈

标签:code   ast   str   方法   integer   for   条件   流程分析   ack   

原文地址:https://www.cnblogs.com/swifthao/p/12776362.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!