14

List<T>fromSystem.Collections.Generic做所有事情Stack<T>,甚至更多——它们基于相同的底层数据结构。在什么情况下选择是正确的Stack<T>

4

5 回答 5

15

如果您需要后进先出的项目集合,您将使用堆栈。列表将允许您在任何索引处访问它的项目。还有很多其他差​​异,但我会说这是最基本的。

评论后更新:

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

于 2012-09-17T21:00:01.967 回答
5

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

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

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

于 2012-09-17T21:08:50.533 回答
4

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

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

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

为工作使用正确的工具;当您需要“随机”访问集合中的任何元素时,请使用 List。当您想要对数组中的元素实施更有限的“仅限顶部”访问时,请使用堆栈。当您想强制执行 FIFO“管道”时使用队列;物品从一端进入,另一端离开。

于 2012-09-17T21:20:49.013 回答
4

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

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

于 2012-09-17T21:02:12.343 回答
0

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

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

两种截然不同的生物。

于 2012-09-17T21:05:05.143 回答