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

【题目】​

       一个栈依次压入1、2、3、4、5,那么从栈顶到栈底分别为5、4、3、2、1。将这个栈转置后,从栈顶到栈底为1、2、3、4、5,也就是实现栈中元素的逆序,但是只能用递归函数来实现,不能用其他的数据结构。

【解答】

        ​首先分为两步。第一步,得到栈底元素并移除这个栈底元素;第二步,将得到的栈底元素逆序入栈。

【代码】

 1 package cn.hl.p3;
 2 
 3 import java.util.Stack;
 4 
 5 /**
 6  * title:一个栈依次压入1、2、3、4、5,
 7  *       那么从栈顶到栈底分别为5、4、3、2、1。
 8  *       将这个栈转置后,从栈顶到栈底为1、2、3、4、5,
 9  *       也就是实现栈中元素的逆序,但是只能用递归函数来实现,不能用其他的数据结构。
10  *
11  * @author 猩生柯北
12  */
13 
14 public class suanfa {
15     /**
16      * 将栈stack的栈底元素返回并移除
17      * @param stack
18      * @return
19      */
20     public static int getAndRemoveLastElement(Stack<Integer> stack){
21         //弹出栈顶元素
22         int result = stack.pop();
23         //判断
24         //弹出元素后如果栈为空,则返回该元素
25         if(stack.isEmpty()){
26             return result;
27         }else{
28             //不为空时,则递归。此时栈为原栈弹出栈顶元素后的一个变化的栈。
29             //当递归到栈底元素时,将栈顶元素返回并赋值给变量last
30             int last = getAndRemoveLastElement(stack);
31             //递归结束。将除栈底元素的其他元素按原先顺序依次入栈。
32             //此时的栈与原栈的区别是:栈底元素被移除
33             stack.push(result);
34             //返回原栈底元素
35             return last;
36         }
37     }
38     
39     /**
40      * 逆序一个栈。
41      * @param stack
42      */
43     public static void reverse(Stack<Integer> stack){
44         //判断。
45         if(stack.isEmpty()){
46             return;
47         }
48         //得到栈底元素
49         int i = getAndRemoveLastElement(stack);
50         //递归。此时的栈是原栈返回并移除栈底元素的一个变化栈。
51         reverse(stack);
52         //递归结束。递归到栈空时,将得到的栈底元素依次(注意顺序!!!)入栈。
53         stack.push(i);
54     }
55     
56     //测试.入栈元素依次为:5,7,9.
57     public static void main(String[] args) {
58         Stack s1 = new Stack();
59         s1.push(5);
60         s1.push(7);
61         s1.push(9);
62         System.out.println("The elements in the original stack:");
63         for( int i=0 ; i <= s1.size()+1; i++ ){
64             System.out.println(s1.pop());
65         }
66         
67         s1.push(5);
68         s1.push(7);
69         s1.push(9);
70         reverse(s1);
71         System.out.println("===================================");
72         System.out.println("The elements in the changed stack:");
73         for( int i=0 ; i <= s1.size()+1; i++ ){
74             System.out.println(s1.pop());
75         }
76     }
77 }
78     

【运行结果】

每接触一个新领域,我就像一块掉进水里的海绵,四面八方的养分都让我不断充实。O(∩_∩)O~
原文地址:https://www.cnblogs.com/zhzcode/p/9574375.html