一、题目描述
一个栈依次压入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。
四、总结
学习算法过程中会遇到各种困难,比如递归就很难理解,自己独立写出一个递归很不容易,所以大家平时注意多练习递归函数,不要怕写不好或写错,大胆的把自己的想法写成程序,潜移默化的就会提高自己的编程和算法水平。
分享给大家一句话来共勉:失败是成功之母!