如何仅用递归函数和栈操作逆序一个栈
1 using System;
2 using System.Collections.Generic;
3
4 namespace ConsoleApp1
5 {
6 /// <summary>
7 /// 使用双递归实现将一个栈的数据,逆向转换
8 /// </summary>
9 class stackTools
10 {
11 /// <summary>
12 /// 递归获得栈底数据(例如这个栈顶到栈底是5.4.3.2.1)
13 /// </summary>
14 /// <param name="stack"></param>
15 /// <returns></returns>
16 public static int GetAndRemoveLastElement(Stack<int> stack)
17 {
18 //将栈顶的数据弹出
19 int result = stack.Pop();
20 //如果栈没有数据,结束递归
21 if (stack.Count == 0)
22 {
23 //得到栈底的数据
24 return result;
25 }
26 else
27 {
28 //保证得到栈底的数据,如果不是则继续递归
29 int last = GetAndRemoveLastElement(stack);
30 //将这前弹出的数据入栈(除了最低的)
31 stack.Push(result);
32 //并返回递归得到后的最底数
33 return last;
34 }
35 }
36
37 /// <summary>
38 ///反转最低数
39 /// </summary>
40 /// <param name="stack"></param>
41 public static void reverse(Stack<int> stack)
42 {
43 //保证栈没有数据时结束递归
44 if (stack.Count == 0) return;
45 //保证获得栈底的数
46 int i = GetAndRemoveLastElement(stack);
47 //逆向的核心因为我们入栈的是5.4.3.2.1,这里递归一依次得到1.2.3.4.5
48 //执行完这几层后会因为没数据而跳出递归
49 reverse(stack);
50 //然后开始压栈
51 stack.Push(i);
52 }
53 }
54 }
我们在Progam来调用,这里没有做任何输出,但是通过断点可以得知已经被逆序了
1 class Program
2 {
3 static void Main(string[] args)
4 {
5
6 Stack<int> stack = new Stack<int>();
7 stack.Push(1);
8 stack.Push(2);
9 stack.Push(3);
10 stack.Push(4);
11 stack.Push(5);
12 stackTools.reverse(stack);
13
14 Console.ReadKey();
15 }
16 }
实际的递归的调试过程是,逆向递归获得了栈顶,然后在依次将之前保存的i,也就是最底数入栈