您使用过"堆栈"对象(.Net)的真实世界用途

Jer*_*uel 10 language-agnostic algorithm data-structures

我们已经阅读或了解了堆栈类,但我们中的许多人可能从未找到使用LIFO对象的理由.我很想知道使用这个对象的现实世界解决方案及其原因.

http://msdn.microsoft.com/en-us/library/system.collections.stack.aspx

我最近看到一个例子,程序员在遍历分层数据源时使用堆栈来跟踪他当前的位置.当他向下移动层次结构时,他将位置标识符推到堆栈上,当他向后移动时,他将物品从堆栈中弹出.我认为这是一种非常有效的方式来跟踪他在乳房等级中的当前位置.我以前从未见过这个.

还有其他人有什么例子吗?

Rya*_*ndy 17

我用它们来跟踪撤消和重做动作.

我使用这样的接口:

interface ICommand
{
    void Execute();
    void Undo();
    string Description { get; }
}
Run Code Online (Sandbox Code Playgroud)

Undo和Redo都是类型Stack<ICommand>.然后我为给定的动作创建一个具体的类.在类的构造函数中,我传递了我需要保留的任何信息. Execute最初行动,并重做它; Undo显然,撤消它.它的工作原理如下:

  • 撤消操作:弹出撤消堆栈并添加到重做堆栈.
  • 重做撤消操作:弹出重做堆栈并再次添加到撤消堆栈.
  • 执行新操作:添加到撤消堆栈并清除重做堆栈(因为状态不再一致).

我发现你必须要小心你正在彻底解决所做的事情.例如,假设您有一个包含两个列表框的UI,每个列表框中都有五个项目.您的操作可能是单击按钮将左侧列表中的所有内容移动到右侧列表(因此它现在有10个,左侧列表为零).

撤消动作不是要将所有东西都移回去; 撤消操作是仅移回实际移动的五个,并保留其他移动.


Hog*_*gan 7

只要调用存储过程/子例程来存储局部变量和返回地址,就会使用堆栈.

堆栈用于表达式评估(例如,在计算器或编译器中),首先将表达式转换为RPN,然后使用简单的堆栈计算机进行评估.当您看到操作数将其推入堆栈时,其工作方式如下.当您看到操作符弹出操作数并进行评估时.

example

5 6 + 3 *

steps-
 see 5 push 5
 see 6 push 6
 see + pop 2 times and apply + get 11 push 11
 see 3 push 3
 see * pop 2 times and apply get 33 push 33

result is on the top of the stack.   
Run Code Online (Sandbox Code Playgroud)


Toa*_*oad 5

如果您有递归算法,通常可以使用堆栈重写它们.(因为递归算法隐式已经使用了堆栈)

  • -1,这根本不是现实世界.如果它是尾递归的,你只需使用while循环; 否则,使用Stack对象比使用递归更加工作(和更慢). (2认同)