• 如何仅用递归函数和栈操作逆序一个栈


    说在前面

    这是一段递归代码,int result = stack.pop() ,一开始 stack.pop() 已经被赋值到result 整型变量,所以 getAndRemoveLastElement(stack) 的返回值为1时,由于并没有再次给 result 重新赋值,所以 result 还是为2

    
    stack.push(1);
    stack.push(2);
    getAndRemoveLastElement(stack);
    
    public int getAndRemoveLastElement(Stack<Integer> stack){
           int result = stack.pop();
           
    //栈是空的就没有执行的必要了,直接返回
           if (stack.isEmpty()){
               return result;
           }else{
               int last = getAndRemoveLastElement(stack);
    	       stack.push(result);
               return last;
           }
        }
    

    回调函数 reverse(),当 stack 为空时,无返回值,执行回调函数下面的 sout(push) 语句。reverse() 并不关心被调用者在何处,也不关心被调用者用它传递的处理程序做了什么,它只关心返回值,因为基于返回值,它将继续执行或退出。

        public void reverse(Stack<Integer> stack){
        //栈是空的就没有执行的必要了
            if (stack.isEmpty()){
                return;
            }
            int i = getAndRemoveLastElement(stack);
            reverse(stack);
            System.out.println(stack.push(i));
        }
    }
    

    命题

    一个栈依次压入 1、2、3、4、5,那么从栈顶到栈底分别为 5、4、3、2、1。将这个栈转置后,从栈顶到栈底为 1、2、3、4、5,也就是实现栈中元素的逆序,但是只能用递归函数来实现,不能用其他数据结构。

    package com.lorem.stack;
    
    import org.junit.Test;
    import java.util.Stack;
    
    /**
     * 如何仅用递归函数和栈操作逆序一个栈【题目】
     *
     * 一个栈依次压入 1、2、3、4、5,那么从栈顶到栈底分别为 5、4、3、2、1。
     * 将这个栈转置后,从栈顶到栈底为 1、2、3、4、5,也就是实现栈中元素的逆序,
     * 但是只能用递归函数来实现,不能用其他数据结构。
     */
    
    /**
     * @author lorem 
     * @date 2018/8/23
     */
    public class MyStack {
    
        @Test
        public void test(){
           MyStack myStack = new MyStack();
           Stack stack = new Stack<Integer>();
           stack.push(1);
           stack.push(2);
    //      myStack.reverse(stack);
            myStack.getAndRemoveLastElement(stack);
        }
    
    
        public int getAndRemoveLastElement(Stack<Integer> stack){
           int result = stack.pop();
    //        System.out.println(result);
           if (stack.isEmpty()){
               return result;
           }else{
               int last = getAndRemoveLastElement(stack);
               stack.push(result);
               return last;
           }
        }
        public void reverse(Stack<Integer> stack){
            if (stack.isEmpty()){
                return;
            }
            int i = getAndRemoveLastElement(stack);
            reverse(stack);
            System.out.println(stack.push(i));
        }
    }
    
    
    - The End -

    知识共享许可协议 本作品采用知识共享署名-非商业性使用 4.0 国际许可协议进行许可。

  • 相关阅读:
    内存泄露的小问题(转载)
    脚本错误:"return 语句不能在函数之外" (转载)
    转载:asp.net网页防刷新重复提交、防后退解决办法集!
    转载:一行代码搞定你的QueryString
    转载 PowerDesigner Name/Code自动调整
    无刷新仿google波形扭曲彩色Asp.net验证码
    转载:认识Web.config文件
    转载:将数据库从SQL2000迁移到SQL2005时,无法查看关系图的解决办法
    [转]WTL的windows mobile环境的配置(vs2008)[最终版,验证通过]
    [转].NET中Cache用法分析
  • 原文地址:https://www.cnblogs.com/hoochanlon/p/9676648.html
Copyright © 2020-2023  润新知