Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
何时使用堆栈<;T>;C#中的集合?_C#_Data Structures - Fatal编程技术网

何时使用堆栈<;T>;C#中的集合?

何时使用堆栈<;T>;C#中的集合?,c#,data-structures,C#,Data Structures,我确实了解Stack()和Stack的工作原理,但我真的看不到任何情况下数组、List或IEnumerable不是更好、更容易的选择 有谁能给我提供一个使用堆栈的真实例子吗?如果你进行语法分析,堆栈可能是有用的数据结构。以下是我使用堆栈的一种方法: 我有一个类似向导的页面,其中有5个用户控件需要按特定顺序显示和处理,用户应该能够在任何时候按顺序返回到最后一个页面 我使用基于堆栈的状态机通过向导跟踪用户的进度 每次它们向前移动时,我都会将状态机的状态推入会话存储的堆栈中,如果它们请求返回,我会弹出

我确实了解
Stack()
Stack
的工作原理,但我真的看不到任何情况下数组、
List
IEnumerable
不是更好、更容易的选择


有谁能给我提供一个使用堆栈的真实例子吗?

如果你进行语法分析,堆栈可能是有用的数据结构。

以下是我使用堆栈的一种方法:

我有一个类似向导的页面,其中有5个用户控件需要按特定顺序显示和处理,用户应该能够在任何时候按顺序返回到最后一个页面

我使用基于堆栈的状态机通过向导跟踪用户的进度

每次它们向前移动时,我都会将状态机的状态推入会话存储的堆栈中,如果它们请求返回,我会弹出顶部值并将机器设置为新的顶部堆栈值。(依次显示并加载适当的控件)

还有一点:

我必须为一些非常定制的服务器应用程序构建一个安装应用程序。我最后做的是将安装的每个步骤分解成它自己的通用组件,即复制文件的组件,写入注册表值的组件,等等。每个组件都必须使用以下方法:执行安装操作,撤消安装操作

安装的每一步,组件都被推入堆栈中

现在,每当我出现错误时,我们都会将每个组件从堆栈中弹出,然后运行撤销操作,从而提供细粒度的安装事务


斯塔克是你的朋友

我想说的是,如果你在建模概念上是堆栈的东西。假设你正在为一个小而深的抽屉建模,你正在把书放进抽屉。这将遵循“先进先出”的范例,这通常是堆栈的要点

你没有书的列表或某种枚举-你有它们的特定顺序。。。也就是说,与添加顺序相反。

深度优先搜索(DFS)是使用堆栈的一个很好的现实例子

。与队列相反,用于宽度优先树遍历


管理在用户浏览时向用户呈现不同的屏幕。显示屏幕将其推到堆栈中,返回将弹出它。绘制顶部屏幕


当你想要一个可以添加东西的集合时,你总是知道什么时候你可以得到一些东西,这是最近添加的



实现撤销/重做功能。

通过控制堆栈上和堆栈下的局部变量,可以更轻松地将递归方法重写为迭代方法。使用堆栈签出的排序。

堆栈和队列在内部使用数组。如果您以智能的方式使用数组,那么很可能您已经以堆栈或队列的方式使用了它们。通常,您需要在堆栈和队列之间做出决定。 需要堆栈的一个典型示例是。如果将集合更改为队列,则实现了广度优先搜索

另一个例子是重多线程,如果处理顺序不相关,则通过堆栈在生产者和消费者之间传递数据。其基本原理是,如果要处理大量数据,CPU最好使用最新添加的数据块在另一个线程上进行进一步处理,以获得更好的缓存位置


这个列表还在继续….

堆栈经常用于文本解析算法,例如“4+5+6”的计算。有关使用堆栈解析文本的应用程序的真实示例,请参阅。这个组件用于解析HTML,它包含源代码,因此您可以查看堆栈的使用方式和位置…

Stack
的功能看起来确实像
List
的一个子集(有一些重命名的方法),所以我同意它本身似乎不是最有用的集合。当在算法内部使用时,
List
可以很容易地替代它,即使它可能稍微不那么惯用

只有当堆栈行为公开时,才需要强制执行堆栈行为。但在这种情况下,在内部集合上公开某种包装器通常是一个更好的主意,因此它似乎也不是很有用。我肯定会看到
IStack
接口的使用,但对于普通集合类
堆栈
就没有这么多了

我的结论是,我不会在框架中包含一个
堆栈
类,而只是一个
IStack
接口。BCL系列在我看来一般都不是经过深思熟虑的


另一方面,
ConcurrentStack
似乎更有用。

理想情况下,您可以使用或根据需要创建反映真实世界中事物如何工作的类,即您在代码中建模的事物。此类类为我们提供了一个抽象级别,因此我们可以根据建模/模拟的内容编写代码。此外,在编写一些复杂的代码时,使用熟悉的范例会有所帮助。也就是说:哦,这个Fuzzinator类使用堆栈。我知道什么是堆栈以及它是如何工作的

第二,更高级别的抽象类为我们提供了有效的代码(我们假设.NET框架已经过测试),并为我们节省了重新发明轮子的时间和痛苦

第三,代码更容易阅读、理解和更改,等等。它更易于维护

使用具有更精细功能的类有助于限制我们在使用它时可能会犯的错误

总的来说,当您的应用程序在适当的抽象级别进行编码时,它会变得更好

Stack就是这些类之一

我的HP-41X计算器使用堆栈进行运算。这种计算方法称为RPN-反向波兰符号

如果我在模拟自助餐厅,那么这堆盘子将非常适合那堆盘子。盘子从顶部上下堆叠。不是正中