一、题目描述
一个栈依次压入1,2,3,4,5,那么从栈顶到栈底分别为5,4,3,2,1。将这个栈转置后,从栈顶到栈底为1,2,3,4,5,也就是实现栈中元素的逆序,但是只能用递归函数来实现,不能用其他数据结构。
二、解答
我们需要两个递归函数:
递归函数一:将栈stack的栈底元素返回并移除。
具体过程就是如下代码中的getAndRemoveLastElement方法
//递归函数一:将栈的栈底元素返回并移除
public static int getAndRemoveLastElement(Stack<Integer> stack) {
int result = stack.pop(); //用于恢复原位做的记录
if(stack.isEmpty()) {
return result;
}else {
int last = getAndRemoveLastElement(stack);
stack.push(result); //恢复原来的顺序
return last;
}
}
下图1是递归函数的具体过程:
图1.递归函数一的具体过程
递归函数二:将栈逆序。
具体请看代码:
//递归函数二:用于将栈逆序
public static void reverse(Stack<Integer> stack) {
if(stack.isEmpty()) {
return;
}
int i = getAndRemoveLastElement(stack);
reverse(stack);
stack.push(i);
}
三、测试验证
课运行调试完整代码:
import java.util.Stack;
/*
* 题目描述:如何仅用递归函数和栈操作逆序一个栈
*/
public class StackOfRecursiveFuction {
public static void main(String[] args) {
StackOfRecursiveFuction s = new StackOfRecursiveFuction();
Stack<Integer> stack = new Stack<Integer>();
stack.push(1);
stack.push(2);
stack.push(3);
System.out.println(stack);
s.reverse(stack);
System.out.println(stack);
}
//递归函数一:将栈的栈底元素返回并移除
public static int getAndRemoveLastElement(Stack<Integer> stack) {
int result = stack.pop(); //用于恢复原位做的记录
if(stack.isEmpty()) {
return result;
}else {
int last = getAndRemoveLastElement(stack);
stack.push(result); //恢复原来的顺序
return last;
}
}
//递归函数二:用于将栈逆序
public static void reverse(Stack<Integer> stack) {
if(stack.isEmpty()) {
return;
}
int i = getAndRemoveLastElement(stack);
reverse(stack);
stack.push(i);
}
}
运行结果截图:
注意:我是用的是stack的toString方法输出的栈,因为栈在java的JDK里是数组实现的,所有用toString方法输出时,是按数组的顺序输出的,若输出结果为[1,2,3],则实际栈顶到栈底的顺序为3,2,1。
四、总结
学习算法过程中会遇到各种困难,比如递归就很难理解,自己独立写出一个递归很不容易,所以大家平时注意多练习递归函数,不要怕写不好或写错,大胆的把自己的想法写成程序,潜移默化的就会提高自己的编程和算法水平。
分享给大家一句话来共勉:失败是成功之母!