为什么要使用Stack 而不是List ?

System.Collections.Generic中的List执行Stack所做的一切,以及更多 – 它们基于相同的底层数据结构。 在什么条件下选择Stack是否正确?

如果您需要Last In First Out项目集合,则可以使用堆栈。 列表将允许您在任何索引处访问它的项目。 还有很多其他的差异,但我会说这是最基本的。

评论后更新:

我会说使用Stack会声明您希望如何使用此代码。 计划未来总是好的,但如果您现在需要Stack ,并且没有令人信服的理由使用List那么我会选择Stack

好吧,如果你在逻辑上试图表示一个堆栈,你会想要使用Stack 。 如果您使用堆栈,它将在整个代码中传达程序员的意图,并且它将防止广告中误用数据结构(无意中添加/删除/读取除了一端之外的某处)。

当然, Stack可能只是一个接口,而不是具体的实现。 然后,您可以使用List实现该接口。 那里的问题主要是方便的问题。 如果有人需要堆栈,他们需要选择一些特定的实现并记住(“哦是的,List是首选的堆栈实现”),而不仅仅是新建具体类型。

这都是关于概念的。 List是List,Stack是Stack,它们做两件非常不同的事情。 他们唯一的共同点是他们的通用性和可变长度。

List是一个可变长度的项集合,其中可以通过索引访问和覆盖任何元素,以及可以添加哪些项以及可以从任何此类索引中删除哪些项。

Stack是支持LIFO访问模型的可变长度项集合; 只能访问Stack的顶部元素,并且只能在集合的“端点”中添加和删除元素。 来自“顶部”的第3项元素只能通过“弹出”它上面的两个元素来访问它以暴露它。

使用正确的工具; 当您需要“随机”访问集合中的任何元素时,请使用List。 如果要对arrays中的元素强制执行更有限的“仅限顶级”访问,请使用堆栈。 如果要强制执行FIFO“管道”,请使用队列; 物品一端到另一端。

为什么我会人为地限制自己在新代码中使用Stack

您有回答 – 当您需要强制执行合同期望时,您应该使用Stack ,即所使用的数据结构只能作为堆栈进行操作。 当然,你真正想做的事情是有限的,但在适当的时候它是一个重要的工具。

例如,假设正在使用的数据没有任何意义,除非强制执行堆栈顺序。 在这些情况下,如果您将数据作为列表提供,那么您将面临麻烦。 通过使用Stack (或Queue或任何其他顺序敏感的结构),您可以在代码中准确指定数据应该如何使用。

System.Collections.Generic.Stack是一个LIFO(后进先出)数据结构, 也就是一个堆栈 。

尽管它的名字, SCG.List不是被称为[链接]列表的抽象数据类型:它实际上是一个可变长度数组 。

两个非常不同的生物。