如何仅用递归函数和栈操作逆序一个栈
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));
}
}
以上是关于如何仅用递归函数和栈操作逆序一个栈的主要内容,如果未能解决你的问题,请参考以下文章