C# Stack(堆栈)

Stack是一种特殊的集合类型,以LIFO方式(后进先出)存储元素。C#包括泛型Stack<T>和非泛型Stack集合类。建议使用泛型Stack<T>集合。

堆栈对于以LIFO形式存储临时数据很有用,并且您可能希望在检索元素的值后将其删除。

Stack <T>特性

  • Stack<T> 是后进先出集合。  

  • 它在System.Collection.Generic命名空间下。

  • Stack<T>可以包含指定类型的元素。它提供编译时类型检查,并且不执行装箱/拆箱,因为它是泛型的。

  • 可以使用Push()方法添加元素。不能使用集合初始化(collection-initializer)语法。

  • 可以使用Pop()和Peek()方法检索元素。它不支持索引器。

创建堆栈

您可以通过为 Stack<T> 其存储的元素类型指定类型参数来创建的对象。下面的示例使用 Push ()方法在 Stack <T> 中创建和添加元素。堆栈允许 null (对于引用类型)和重复值。

Stack<int> myStack = new Stack<int>();
myStack.Push(1);
myStack.Push(2);
myStack.Push(3);
myStack.Push(4);

foreach (var item in myStack)
     Console.Write(item + ","); //打印4,3,2,1,

您还可以从数组创建堆栈,如下所示。

int[] arr = new int[]{ 1, 2, 3, 4};
Stack<int> myStack = new Stack<int>(arr);

foreach (var item in myStack)
     Console.Write(item + ","); //打印4,3,2,1,

Stack <T> 属性和方法:

属性用法
Count返回堆栈中元素的总数。
方法用法
Push(T)在堆栈顶部插入一个项目。
Peek()返回堆栈顶部的项目。
Pop()从堆栈顶部删除并返回项目。
Contains(T)检查堆栈中是否存在项目。
Clear()从堆栈中删除所有项目。

Pop()

Pop() 方法返回最后一个元素,并将其从堆栈中删除。如果堆栈为空,则将抛出 InvalidOperationException。因此,在调用Pop()方法之前,请始终检查堆栈中的元素数。

Stack<int> myStack = new Stack<int>();
myStack.Push(1);
myStack.Push(2);
myStack.Push(3);
myStack.Push(4);

Console.Write("堆栈中的元素数: {0}", myStack.Count);

while (myStack.Count > 0)
     Console.Write(myStack.Pop() + ",");

Console.Write("堆栈中的元素数: {0}", myStack.Count);
输出:
堆栈中的元素数:4
4,3,2,1,
堆栈中的元素数:0

Peek()

Peek()方法从堆栈中返回最后添加的值,但不会将其删除。在空堆栈上调用 Peek() 方法将抛出 InvalidOperationException。因此,在使用Peek()方法检索元素之前,请始终检查堆栈中的元素。

Stack<int> myStack = new Stack<int>();
myStack.Push(1);
myStack.Push(2);
myStack.Push(3);
myStack.Push(4);

Console.Write("Number of elements in Stack: {0}", myStack.Count);// 输出 4

if(myStack.Count > 0){
     Console.WriteLine(myStack.Peek()); // 输出 4
     Console.WriteLine(myStack.Peek()); // 输出 4
}

Console.Write("Number of elements in Stack: {0}", myStack.Count);// 输出 4

Contains()

Contains()方法检查指定元素在Stack集合中是否存在。如果存在,则返回true,否则返回false。

Stack<int> myStack = new Stack<int>();
myStack.Push(1);
myStack.Push(2);
myStack.Push(3);
myStack.Push(4);

myStack.Contains(2); // 返回true
myStack.Contains(10); // 返回false