Stack是一种特殊的集合类型,以LIFO方式(后进先出)存储元素。C#包括泛型Stack<T>和非泛型Stack集合类。建议使用泛型Stack<T>集合。
堆栈对于以LIFO形式存储临时数据很有用,并且您可能希望在检索元素的值后将其删除。
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,
属性 | 用法 |
---|---|
Count | 返回堆栈中元素的总数。 |
方法 | 用法 |
---|---|
Push(T) | 在堆栈顶部插入一个项目。 |
Peek() | 返回堆栈顶部的项目。 |
Pop() | 从堆栈顶部删除并返回项目。 |
Contains(T) | 检查堆栈中是否存在项目。 |
Clear() | 从堆栈中删除所有项目。 |
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() 方法将抛出 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()方法检查指定元素在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