List<T>
的 System.Collections.Generic
执行Stack<T>
所做的一切,以及更多 - 它们基于相同的基础数据结构。在什么条件下选择Stack<T>
呢?
答案 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。
两种非常不同的生物。