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个,左侧列表为零).
撤消动作不是要将所有东西都移回去; 撤消操作是仅移回实际移动的五个,并保留其他移动.
只要调用存储过程/子例程来存储局部变量和返回地址,就会使用堆栈.
堆栈用于表达式评估(例如,在计算器或编译器中),首先将表达式转换为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)
如果您有递归算法,通常可以使用堆栈重写它们.(因为递归算法隐式已经使用了堆栈)