Stack 构造函数在从其他堆栈初始化时是否反转堆栈?

这是代码:

var s = new Stack(); s.Push(1); s.Push(2); s.Push(3); s.Push(4); var ns = new Stack(s); var nss = new Stack(new Stack(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堆栈被还原堆栈, nss堆栈与s堆栈相同。

采用IEnumerable的堆栈构造函数推送项目,就像多次调用Add一样。

迭代堆栈以“pop”顺序迭代…所以当你从另一个堆栈构造一个堆栈时,它将首先添加原始堆栈的顶部,然后在新的堆栈中添加“从顶部开始的第二个”元素堆栈等…有效地逆转它。

您用于nsnss的构造函数是Stack(IEnumerable) 。 枚举堆栈时,它从上到下枚举。 但是在创建堆栈时,它会按枚举顺序推送元素。 因此,最后一个枚举项(源代码中的最后一个)将是新堆栈的顶部。

所以是的,它确实颠倒了元素的顺序。

令您惊讶的线索在于您的问题:

Stack <>构造函数在从其他堆栈初始化时是否反转堆栈?

你指的是接受另一个Stack – 相反,它接受一个IEnumerable 。 也就是说,与从任何其他IEnumerable构造Stack相比,从Stack构造Stack没有特殊处理。

因此,当您尝试从Stack构建Stack ,源Stack将以其自然枚举顺序(即弹出顺序)使用。 并且通过推送传入的IEnumerable的项来构造新的Stack 。 因此,你看到的行为。