zoukankan      html  css  js  c++  java
  • 栈--原地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掉

  • 相关阅读:
    Unity The Method Signature Matching Rule
    Unity The Property Matching Rule
    Unity The Type Matching Rule
    Unity The Custom Attribute Matching Rule
    Unity The Member Name Matching Rule
    Unity No Policies
    Unity The Return Type Matching Rule
    Unity The Parameter Type Matching Rule
    Unity The Namespace Matching Rule
    关于TSQL递归查询的(转)
  • 原文地址:https://www.cnblogs.com/swifthao/p/12776362.html
Copyright © 2011-2022 走看看