如何仅用递归函数和栈操作逆序一个栈(java实现)

一、题目描述

    一个栈依次压入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。

四、总结

          学习算法过程中会遇到各种困难,比如递归就很难理解,自己独立写出一个递归很不容易,所以大家平时注意多练习递归函数,不要怕写不好或写错,大胆的把自己的想法写成程序,潜移默化的就会提高自己的编程和算法水平。

         分享给大家一句话来共勉:失败是成功之母!




猜你喜欢

转载自blog.csdn.net/alan_gaohaodong/article/details/79287138
今日推荐