码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2017-12-10 11:06:25      阅读:109      评论:0      收藏:0      [点我收藏+]

标签:如何   2.3   实现   namespace   保存   []   rem   too   logs   

技术分享图片

 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,也就是最底数入栈

技术分享图片

 

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

标签:如何   2.3   实现   namespace   保存   []   rem   too   logs   

原文地址:http://www.cnblogs.com/BigDong/p/8014796.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!