是新的Stack <t>(curStack)返回反向堆栈错误吗?</t>

时间:2013-12-24 19:40:04

标签: c# stack

这似乎是一个错误。考虑以下: stack order: skip skip match

......然后:
stack order: match skip skip

在做了一些检查之后,我找到了this answer as to some 'reversal' in stack order

期望第二个堆栈与原始堆栈的顺序相同是不正确的?
这是一个错误吗?

2 个答案:

答案 0 :(得分:6)

不,这不是错误。

堆栈将首先生成最近添加的项目。所以当你去填充新的堆栈时,你首先要添加最新的项目。由于此项目首先被添加,现在它将成为新堆栈中“最旧”的项目,即使它是旧堆栈中的“最新”项目。

逆转是完全预期的行为。

如果你有一个队列,那么写var newQueue = new Queue<T>(oldQueue);将有效地创建一个副本。队列首先生成最旧的项目,因此旧队列中最旧的项目将成为新队列中最旧的项目。列表也是如此。

您似乎认为存在某种复制构造函数,其中堆栈需要另一个堆栈并进行复制。这是不真实的,它只接受IEnumerable<T>作为输入。对于ListQueue,这具有复制的效果,因为堆栈只是具有反转项目的效果。

答案 1 :(得分:2)

这是设计的。

请注意,您使用的constructor overload of Stack<T>需要IEnumerable<T>。它的工作方式是迭代IEnumarable<T>并将项目添加到堆栈。

现在,您正在传递另一个Stack<T>作为参数。预期IEnumerable<T>的行为方式是按照从堆栈中取出它们时的顺序给出项目(即LIFO:Last-In First-Out)。

因此,事实上,这些操作有望扭转堆栈。