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”顺序迭代…所以当你从另一个堆栈构造一个堆栈时,它将首先添加原始堆栈的顶部,然后在新的堆栈中添加“从顶部开始的第二个”元素堆栈等…有效地逆转它。
您用于ns
和nss
的构造函数是Stack
。 枚举堆栈时,它从上到下枚举。 但是在创建堆栈时,它会按枚举顺序推送元素。 因此,最后一个枚举项(源代码中的最后一个)将是新堆栈的顶部。
所以是的,它确实颠倒了元素的顺序。
令您惊讶的线索在于您的问题:
Stack <>构造函数在从其他堆栈初始化时是否反转堆栈?
你指的是不接受另一个Stack
– 相反,它接受一个IEnumerable
。 也就是说,与从任何其他IEnumerable
构造Stack
相比,从Stack
构造Stack
没有特殊处理。
因此,当您尝试从Stack
构建Stack
,源Stack
将以其自然枚举顺序(即弹出顺序)使用。 并且通过推送传入的IEnumerable
的项来构造新的Stack
。 因此,你看到的行为。