• 栈--原地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掉

  • 相关阅读:
    c语言动态申请内存(malloc与calloc)
    二维数组的指针
    二分查找(用c语言实现)
    Docker一篇从入门到实战
    MyBatisPlus一篇从入门到实战
    MyBatis一篇从入门到实战
    MySQL一篇从入门到实战
    Nginx一篇从入门到实战
    day04_02逻辑运算符
    day4_01循环引用带来的内存泄露问题
  • 原文地址:https://www.cnblogs.com/swifthao/p/12776362.html
Copyright © 2020-2023  润新知