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

Posted loremwalker

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何仅用递归函数和栈操作逆序一个栈相关的知识,希望对你有一定的参考价值。

说在前面

这是一段递归代码,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));
    }
}

以上是关于如何仅用递归函数和栈操作逆序一个栈的主要内容,如果未能解决你的问题,请参考以下文章

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

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

编程3:仅用递归函数和栈操作逆序一个栈

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

1.3 仅用递归函数和栈操作逆序一个栈

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