简介

在C#中,先进后出(Last In, First Out,LIFO)的数据结构是栈(Stack)。栈是一种集合,它允许两个基本操作:推入(Push)和弹出(Pop)。

  • 推入(Push):将一个元素放置在栈的顶部。

  • 弹出(Pop):移除并返回栈顶部的元素。

栈的操作原则是“后进先出”,意味着最后推入栈的元素将是第一个被弹出的元素。C#的System.Collections.Stack​​类实现了这种数据结构。
以下是一个使用Stack​​类的简单示例:

using System;
using System.Collections;
class Program
{
    static void Main()
    {
        Stack myStack = new Stack();
        // 向栈中推入元素
        myStack.Push("第一个");
        myStack.Push("第二个");
        myStack.Push("第三个");
        // 从栈中弹出元素
        Console.WriteLine(myStack.Pop()); // 输出:第三个
        Console.WriteLine(myStack.Pop()); // 输出:第二个
        Console.WriteLine(myStack.Pop()); // 输出:第一个
    }
}

在这个示例中,我们首先推入了三个字符串元素到栈中。当我们从栈中弹出元素时,最后一个推入的元素("第三个")首先被弹出,然后是"第二个",最后是"第一个",符合先进后出的原则。

基本操作

在C#中,Stack​ 类提供了以下一些基本操作:

  1. Push: 将对象推入堆栈的顶部。

    stack.Push(item);
  2. Pop: 移除并返回堆栈顶部的对象。

    object obj = stack.Pop();
  3. Peek: 返回堆栈顶部的对象,但不将其移除。

    object obj = stack.Peek();
  4. Clear: 从堆栈中移除所有对象。

    stack.Clear();
  5. Contains: 检查堆栈中是否包含特定对象。

    bool contains = stack.Contains(item);
  6. ToArray: 将堆栈的元素复制到新数组中。

    object[] array = stack.ToArray();
  7. TrimExcess: 将堆栈容量减少到堆栈中元素的实际数量。

    stack.TrimExcess();
  8. Count: 获取堆栈中元素的数量。

    int count = stack.Count;
  9. IsEmpty: 检查堆栈是否为空。

    bool isEmpty = stack.IsEmpty();
  10. GetEnumerator: 返回遍历堆栈的枚举器。

    IEnumerator enumerator = stack.GetEnumerator();

请注意,Stack​ 类继承自 ICollection​IList​ 接口,因此它还继承了这些接口的属性和方法,如 CopyTo​、IsSynchronized​ 等。
下面是一个简单的示例,展示了如何使用这些操作:

using System;
using System.Collections;
class Program
{
    static void Main()
    {
        Stack myStack = new Stack();
        // 推入元素
        myStack.Push("第一个");
        myStack.Push("第二个");
        myStack.Push("第三个");
        // 检查堆栈是否为空
        Console.WriteLine("堆栈是否为空:{0}", myStack.IsEmpty()); // 输出:堆栈是否为空:False
        // 获取堆栈顶部元素
        Console.WriteLine("堆栈顶部元素:{0}", myStack.Peek()); // 输出:堆栈顶部元素:第三个
        // 弹出堆栈顶部元素
        Console.WriteLine("弹出的元素:{0}", myStack.Pop()); // 输出:弹出的元素:第三个
        // 检查堆栈中是否包含某个元素
        Console.WriteLine("堆栈是否包含'第一个':{0}", myStack.Contains("第一个")); // 输出:堆栈是否包含'第一个':True
        // 获取堆栈中元素的数量
        Console.WriteLine("堆栈中元素的数量:{0}", myStack.Count); // 输出:堆栈中元素的数量:2
        // 将堆栈转换为数组
        object[] array = myStack.ToArray();
        Console.WriteLine("堆栈转换为数组:{0}", string.Join(", ", array)); // 输出:堆栈转换为数组:第二个, 第一个
        // 清空堆栈
        myStack.Clear();
        Console.WriteLine("清空堆栈后,堆栈是否为空:{0}", myStack.IsEmpty()); // 输出:清空堆栈后,堆栈是否为空:True
    }
}

在这个示例中,我们使用了 Stack​ 类的各种操作来演示它们的功能。