以下是代码:
var s = new Stack<int>();
s.Push(1);
s.Push(2);
s.Push(3);
s.Push(4);
var ns = new Stack<int>(s);
var nss = new Stack<int>(new Stack<int>(s));
然后让我们看看结果
tbLog.Text += "s stack:";
while(s.Count > 0)
{
tbLog.Text += s.Pop() + ",";
}
tbLog.Text += Environment.NewLine;
tbLog.Text += "ns stack:";
while (ns.Count > 0)
{
tbLog.Text += ns.Pop() + ",";
}
tbLog.Text += Environment.NewLine;
tbLog.Text += "nss stack:";
while (nss.Count > 0)
{
tbLog.Text += nss.Pop() + ",";
}
产生以下输出:
s stack:4,3,2,1,
ns stack:1,2,3,4,
nss stack:4,3,2,1,
因此,ns
堆栈被还原s
堆栈,nss
堆栈与s
堆栈相同。
答案 0 :(得分:13)
使用IEnumerable<T>
的堆栈构造函数推送项目,就像多次调用Add
一样。
迭代堆栈以“pop”顺序迭代...所以当你从另一个堆栈构造一个堆栈时,它将首先添加原始堆栈的顶部,然后将“从顶部开始的第二个”元素放在其上在新的堆栈等...有效地逆转它。
答案 1 :(得分:3)
您用于ns
和nss
的构造函数是Stack<T>(IEnumerable<T>)
。枚举堆栈时,它从上到下枚举。但是在创建堆栈时,它会按枚举顺序推送元素。所以最后一个枚举项(源代码中的最后一个)将是新堆栈的顶部。
所以是的,它确实颠倒了元素的顺序。
答案 2 :(得分:3)
你的惊讶的线索在你的问题中:
Stack&lt;&gt;构造函数在从另一个?
初始化时反转堆栈
您指的是不接受另一个Stack
- 而是接受IEnumerable
。也就是说,与从Stack
构建Stack
相比,从Stack
构建IEnumerable
没有特殊处理。
因此,当您尝试从Stack
构建Stack
时,源Stack
会以其自然枚举顺序消耗,即在弹出中消耗订购。新Stack
由推送传入的IEnumerable
项构成。因此,你看到的行为。