为什么要使用Stack <t>而不是List <t>?</t> </t>

时间:2012-09-17 20:55:37

标签: c# .net collections

来自List<T>

System.Collections.Generic执行Stack<T>所做的一切,以及更多 - 它们基于相同的基础数据结构。在什么条件下选择Stack<T>呢?

5 个答案:

答案 0 :(得分:13)

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

评论后更新:

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

答案 1 :(得分:4)

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

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

答案 2 :(得分:4)

  

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

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

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

答案 3 :(得分:3)

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

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

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

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

答案 4 :(得分:0)

System.Collections.Generic.Stack<T>是一个LIFO(后进先出)数据结构又名 a stack

尽管名称为SCG.List<T>,但{{1}}不是称为[linked] list的抽象数据类型:实际上它是variable-length array

两种非常不同的生物。