C#集合本质之堆栈的用法详解

C#集合本质之堆栈的用法详解

什么是堆栈(Stack)?

堆栈是一种特殊的数据结构,它的特点是后进先出(Last In First Out, LIFO)。堆栈通常是通过数组或链表实现的,操作系统在进程调度、函数调用、表达式求值等方面广泛应用了堆栈。

C#堆栈的实现

C#中实现堆栈的数据结构有两种,一种是System.Collections.Stack类,另一种是System.Collections.Generic.Stack泛型类。

System.Collections.Stack

该类是C#在1.0版本时引入的,它的特点是线程安全,但在性能上较泛型类要慢。

Stack stack = new Stack();
stack.Push("A");
stack.Push("B");
stack.Push("C");

while (stack.Count > 0)
{
    Console.WriteLine(stack.Pop());
}

上述代码在堆栈中依次压入"A"、"B"、"C"三个元素,而后依次弹出并输出它们。输出结果为:

C
B
A

System.Collections.Generic.Stack

该类是C#在2.0版本时引入的,使用时需要使用命名空间System.Collections.Generic,它的特点是泛型,并且在性能上比非泛型类要快。

Stack<string> stack = new Stack<string>();
stack.Push("A");
stack.Push("B");
stack.Push("C");

while (stack.Count > 0)
{
    Console.WriteLine(stack.Pop());
}

上述代码与前一个示例类似,只是使用了泛型类。输出结果也与前一个示例相同。

堆栈的应用

堆栈的应用十分广泛,以下是两个实际的应用示例。

括号匹配

代码中使用堆栈来解决括号匹配的问题。

public bool IsValid(string s) {
    Stack<char> stack = new Stack<char>();
    for (int i = 0, length = s.Length; i < length; i++) {
        char ch = s[i];
        if (ch == '(' || ch == '[' || ch == '{') {
            stack.Push(ch);
        } else {
            if (stack.Count == 0) {
                return false;
            }
            char top = stack.Pop();
            if (ch == ')' && top != '(') {
                return false;
            }
            if (ch == ']' && top != '[') {
                return false;
            }
            if (ch == '}' && top != '{') {
                return false;
            }
        }
    }
    return stack.Count == 0;
}

代码中使用堆栈来保存左括号,并在遇到右括号时进行匹配,匹配失败则返回false。

逆序输出单词

代码中使用堆栈来逆序输出单词。

public string ReverseWords(string s) {
    StringBuilder sb = new StringBuilder();
    Stack<char> stack = new Stack<char>();
    for (int i = 0, length = s.Length; i < length; i++) {
        char ch = s[i];
        if (ch != ' ') {
            stack.Push(ch);
        } else {
            while (stack.Count > 0) {
                sb.Append(stack.Pop());
            }
            sb.Append(' ');
        }
    }
    while (stack.Count > 0) {
        sb.Append(stack.Pop());
    }
    return sb.ToString();
}

代码中将每个单词的字母按照顺序压入堆栈中,当遇到空格时逆序输出。最后返回逆序后的字符串。

小结

本文详细介绍了C#中堆栈的实现和应用,堆栈是一种经典的数据结构,在算法中应用广泛。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#集合本质之堆栈的用法详解 - Python技术站

(0)
上一篇 2023年6月7日
下一篇 2023年6月7日

相关文章

  • C# 格式化字符串的实现代码

    C# 格式化字符串的实现代码是用于将不同数据类型的值格式化为指定的字符串输出。这里提供两种方式实现格式化字符串的功能:使用占位符的方式和使用字符串插值的方式。 使用占位符的方式 在C#中,使用占位符({})是一种常见的格式化字符串的方式,在占位符内可以使用大括号中指定的格式化字符将数据类型转换为字符串。下面是一个格式化字符串的示例: string s = s…

    C# 2023年5月31日
    00
  • WPF实现上下滚动字幕效果

    WPF实现上下滚动字幕效果 在 WPF 中,实现上下滚动字幕效果通常可以使用 TranslateTransform 和 DoubleAnimation 实现。具体步骤如下: 步骤一:创建外层容器 首先,我们需要创建一个外层容器,用于包含字幕元素。这个容器可以是一个 StackPanel 或 Canvas,根据项目实际需求而定。这里我们使用 StackPane…

    C# 2023年6月1日
    00
  • .NET Core 2.0 Preview2 发布汇总

    .NET Core 2.0 Preview2 发布汇总 简介 .NET Core 2.0 Preview2 是微软推出的基于 .NET Core 的第 二个预览版,其中包括了很多新特性、增强功能,同时也修复了一些已知问题和 bug 。 主要更新内容 .NET 标准库的版本升级到 2.0。 重新设计和重构了开发工具链,包括 .NET Core SDK 和 .N…

    C# 2023年6月3日
    00
  • sql 语句 取数据库服务器上所有数据库的名字

    要取数据库服务器上所有数据库的名字,可以使用以下 SQL 语句: SHOW DATABASES; 执行这条语句将返回一个包含所有数据库名字的列表。 示例1:获取所有数据库的名字 SHOW DATABASES; 执行结果类似于下面这样: +——————–+ | Database | +——————–+ | i…

    C# 2023年5月31日
    00
  • C#使用linq计算执行元素在列表中出现次数的方法

    下面是使用LINQ计算执行元素在列表中出现次数的方法的完整攻略。 标题 C#使用LINQ计算执行元素在列表中出现次数的方法 内容 一般来说,计算元素在列表中出现的次数是一个很常见的需求,下面我们就介绍如何使用LINQ对列表进行查询,以计算元素在列表中出现的次数。 1. 使用GroupBy方法进行分组 要计算元素在列表中出现的次数,我们可以通过先将列表按照元素…

    C# 2023年6月1日
    00
  • C# String.Length方法: 获取字符串的长度

    String.Length是C#中用于获取字符串长度的属性,它的作用是返回字符串中字符的个数,这个长度计数包括空格和特殊字符。 下面介绍一下String.Length的使用方法: 语法格式 字符串.Length 返回值类型 Int32 示例一 string str = "hello world"; int length = str.Len…

    C# 2023年4月19日
    00
  • C#程序窗体间使用回调事件方式通讯示例

    首先需要注意的是,C#窗体间的通讯方式有很多种,而使用回调事件方式通讯是其中一种较为常见的方式。实现回调事件通讯,需要了解委托和事件的相关知识。 一、委托和事件 委托(Delegate)是C#中一个非常重要的概念,它可以看做是一个函数指针,可以指向一个或多个方法。而事件(Event)则是使用委托的一种方式,可以通过事件来触发委托执行。 在C#中声明委托,需要…

    C# 2023年6月7日
    00
  • asp.net neatUpload 支持大文件上传组件

    ASP.NET NeatUpload是一个用于实现大文件上传的组件,它支持各种文件上传场景,并提供了丰富的API以适应不同的需求。下面将详细讲解如何使用该组件实现大文件上传的完整攻略。 1. 安装和配置 首先需要将NeatUpload组件添加到项目中。可使用NuGet安装或者手动下载添加。 Nuget安装: Install-Package NeatUploa…

    C# 2023年6月1日
    00
合作推广
合作推广
分享本页
返回顶部