C#高级编程(第10版) C# 6 & .NET Core 1.0 (.NET开发经典名著)
上QQ阅读APP看书,第一时间看更新

11.5 栈

栈是与队列非常类似的另一个容器,只是要使用不同的方法访问栈。最后添加到栈中的元素会最先读取。栈是一个后进先出(Lastin, Firstout, LIFO)的容器。

图11-2表示一个栈,用Push()方法在栈中添加元素,用Pop()方法获取最近添加的元素。

图11-2

与Queue<T>类相似,Stack<T>类实现IEnumerable<T>和ICollection接口。

Stack<T>类的成员如表11-3所示。

表11-3

在下面的例子中,使用Push()方法把3个元素添加到栈中。在foreach方法中,使用IEnumerable接口迭代所有的元素。栈的枚举器不会删除元素,它只会逐个返回元素(代码文件StackSample/Program.cs)。

        var alphabet = new Stack<char>();
        alphabet.Push('A');
        alphabet.Push('B');
        alphabet.Push('C');
        foreach (char item in alphabet)
        {
          Write(item);
        }
        WriteLine();

因为元素的读取顺序是从最后一个添加到栈中的元素开始到第一个元素,所以得到的结果如下:

        CBA

用枚举器读取元素不会改变元素的状态。使用Pop()方法会从栈中读取每个元素,然后删除它们。这样,就可以使用while循环迭代集合,检查Count属性,确定栈中是否还有元素:

        var alphabet = new Stack<char>();
        alphabet.Push('A');
        alphabet.Push('B');
        alphabet.Push('C');
        Write("First iteration: ");
        foreach (char item in alphabet)
        {
          Write(item);
        }
        WriteLine();
        Console.Write("Second iteration: ");
        while (alphabet.Count > 0)
        {
          Write(alphabet.Pop());
        }
        WriteLine();

结果是两个CBA,每次迭代对应一个CBA。在第二次迭代后,栈变空,因为第二次迭代使用了Pop()方法:

        First iteration: CBA
        Second iteration: CBA