Skip to content

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没有改变数量 
}

简单就是美