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


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

  • 相关阅读:
    python-模块-tkinter
    Linux-命令-基本-反引号``或$()
    Linux-命令-基本-time,ctime,atime
    Linux-命令-基本-find-exec
    Linux-命令-cp,mkdir
    Linux-命令-setup,ifup,ls,cd,touch重定向
    Linux-Buffer和Cache
    给Access数据库文件减肥
    GPT转MBR怎么转?
    Windows XP解决显示桌面图标消失的问题
  • 原文地址:https://www.cnblogs.com/BigDong/p/8014796.html
Copyright © 2020-2023  润新知