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

时间:2010-07-21 09:10:12

标签: c# constructor stack reverse

以下是代码:

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堆栈相同。

3 个答案:

答案 0 :(得分:13)

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

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

答案 1 :(得分:3)

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

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

答案 2 :(得分:3)

你的惊讶的线索在你的问题中:

  

Stack&lt;&gt;构造函数在从另一个

初始化时反转堆栈

您指的是接受另一个Stack - 而是接受IEnumerable。也就是说,与从Stack构建Stack相比,从Stack构建IEnumerable没有特殊处理。

因此,当您尝试从Stack构建Stack时,源Stack会以其自然枚举顺序消耗,即在弹出中消耗订购。新Stack推送传入的IEnumerable项构成。因此,你看到的行为。