C# - Stack<T>
栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。 向一个栈插入新元素又称作进栈、入栈或压栈(push),它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素; 从一个栈删除元素又称作出栈或退栈(pop),它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。 它这种存储方式被称为 LIFO (Last in first out)(后进先出,选进后出) C# 包括泛型 Stack<T> 和非泛型 Stack 集合类。 建议使用泛型 Stack<T> 集合。
堆栈 Stack<T> 特点
- Stack<T> 是后进先出集合。
- 它位于 System.Collection.Generic 命名空间下。
- Stack<T> 可以包含指定类型的元素。 它提供编译时类型检查并且不执行装箱拆箱,因为它是泛型。
- 可以使用 Push() 方法添加元素。 不能使用集合初始值设定项语法。
- 可以使用 Pop() 和 Peek() 方法检索元素。 它不支持索引器。
创建一个堆栈 Stack
您可以通过为 Stack<T> 可以存储的元素类型指定类型参数来创建 Stack<T> 的对象。 以下示例使用 Push() 方法在 Stack<T> 中创建和添加元素。 堆栈允许null(对于引用类型)和重复值。
csharp
static void Main(string[] args)
{
var 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,
}也可以通过数组来创建一个堆栈
csharp
static void Main(string[] args)
{
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 类的方法和属性
下表列出了 Stack 类的一些常用的 属性:
| 属性 | 描述 |
|---|---|
| Count | 获取 Stack 中包含的元素个数。 |
下表列出了 Stack 类的一些常用的 方法:
| 方法名 | 描述 |
|---|---|
| void Clear() | 从 Stack 中移除所有的元素。 |
| bool Contains(T item) | 判断某个元素是否在 Stack 中。 |
| T Peek() | 返回在 Stack 的顶部的对象,但不移除它。 |
| T Pop() | 移除并返回在 Stack 的顶部的对象。 |
| void Push(T item) | 向 Stack 的顶部添加一个对象。 |
| T[] ToArray() | 复制 Stack 到一个新的数组中。 |
contains pop peek 例子
csharp
static void Main(string[] args)
{
var myStack = new Stack<int>();
myStack.Push(1);
myStack.Push(2);
myStack.Push(3);
myStack.Push(4);
Console.WriteLine("包含3" + myStack.Contains(3));//包含3True
var first = myStack.Pop(); //4
var second = myStack.Pop();//3
Console.WriteLine($"第一个:{first},第二个:{second}");
Console.WriteLine("包含3" + myStack.Contains(3));//包含3False
Console.WriteLine(myStack.Count());//2
var third = myStack.Peek();
Console.WriteLine($"第三个:{third}"); //第三个: 2
Console.WriteLine(myStack.Count());//2 说明peek没有改变数量
}