List<T>
fromSystem.Collections.Generic
做所有事情Stack<T>
,甚至更多——它们基于相同的底层数据结构。在什么情况下选择是正确的Stack<T>
?
5 回答
如果您需要后进先出的项目集合,您将使用堆栈。列表将允许您在任何索引处访问它的项目。还有很多其他差异,但我会说这是最基本的。
评论后更新:
我会说 usingStack<T>
声明了您希望如何使用此代码。为未来做计划总是好的,但如果你Stack<T>
现在需要,并且没有令人信服的理由使用,List<T>
那么我会选择Stack<T>
为什么我会人为地限制自己在新代码中使用 Stack
这就是您的答案 -Stack
当您需要强制执行合同期望时,您应该使用正在使用的数据结构只能作为堆栈操作。当然,你真正想做的时间是有限的,但在适当的时候它是一个重要的工具。
例如,假设除非强制执行堆栈顺序,否则正在处理的数据没有任何意义。在这些情况下,如果您将数据作为列表提供,您将面临麻烦。通过使用 a Stack
(或 aQueue
或任何其他对顺序敏感的结构),您可以在代码中准确指定应该如何使用数据。
这都是关于概念的。List 是 List,Stack 是 Stack,它们做了两件非常不同的事情。它们唯一的共同点是它们的通用性和可变长度。
List 是一个可变长度的项目集合,其中任何元素都可以通过索引访问和覆盖,并且可以在任何此类索引处添加项目和从中删除项目。
Stack 是支持 LIFO 访问模型的可变长度项目集合;只能访问堆栈的顶部元素,并且只能从集合的“端点”添加和删除元素。“顶部”中的第 3 项元素只能通过“弹出”它上面的两个元素以暴露它来访问。
为工作使用正确的工具;当您需要“随机”访问集合中的任何元素时,请使用 List。当您想要对数组中的元素实施更有限的“仅限顶部”访问时,请使用堆栈。当您想强制执行 FIFO“管道”时使用队列;物品从一端进入,另一端离开。
Stack
好吧,如果您在逻辑上尝试表示堆栈,您会想要使用。如果您使用堆栈,它将在整个代码中传达程序员的意图,并且它将防止无意中误用数据结构(无意中添加/删除/读取一端以外的其他地方)。
当然,Stack
可能只是一个接口,而不是一个具体的实现。然后你可以有类似List
实现该接口的东西。那里的问题主要是方便问题。如果有人需要一个堆栈,他们需要选择一些特定的实现并记住(“哦,是的,List 是首选的堆栈实现”),而不是仅仅更新具体类型。