C#栈和队列的简介,算法与应用简单实例

C#栈和队列的简介

什么是栈和队列?

栈(Stack)和队列(Queue)是两种常用的数据结构,它们都是线性数据结构。

栈就像是一个箱子,我们往箱子里放入物品(压栈),并取出箱子里面的物品(弹栈)。

队列就像是一条排队的队伍,我们往队伍的尾部加入一个人(入队),并从队伍的头部取出一个人(出队)。

算法

栈(Stack)

1.入栈(Push):将一个元素加入栈顶。

2.出栈(Pop):删除栈顶的元素,同时返回这个元素。

3.查看栈顶元素(Peek):返回栈顶元素,但不删除它。

4.栈的判空(IsEmpty):判断栈是否为空,如果为空返回True,反之返回False。

队列(Queue)

1.入队(Enqueue):向队列尾部添加一个元素。

2.出队(Dequeue):返回队列头部的元素并将其从队列中删除。

3.查看队列头部元素(Peek):返回队列头部的元素,但不删除它。

4.队列的长度(Count):返回队列中元素的个数。

应用

栈(Stack)

1.平衡符号检查:检查表达式中的符号是否配对,如圆括号、方括号、大括号等。

示例代码:

public bool CheckSyntax(string expression)
{
    Stack<char> stack = new Stack<char>();

    foreach(char c in expression)
    {
        if(c == '(' || c == '{' || c == '[')
        {
            stack.Push(c);
        }
        else if(c == ')' || c == '}' || c == ']')
        {
            if(stack.Count == 0) return false;

            char top = stack.Pop();

            if((c == ')' && top != '(') || (c == '}' && top != '{') || (c == ']' && top != '['))
            {
                return false;
            }
        }
    }

    return stack.Count == 0;
}

2.逆波兰式计算器:将中缀表达式转换为后缀表达式(逆波兰式),然后用栈计算后缀表达式的值。

示例代码:

public double Calculate(string expression)
{
    Stack<double> stack = new Stack<double>();
    string[] tokens = expression.Split(' ');

    foreach(string token in tokens)
    {
        if(double.TryParse(token, out double number))
        {
            stack.Push(number);
        }
        else
        {
            double right = stack.Pop();
            double left = stack.Pop();

            switch(token)
            {
                case "+":
                    stack.Push(left + right);
                    break;
                case "-":
                    stack.Push(left - right);
                    break;
                case "*":
                    stack.Push(left * right);
                    break;
                case "/":
                    stack.Push(left / right);
                    break;
            }
        }
    }

    return stack.Pop();
}

队列(Queue)

1.广度优先搜索(BFS):在图或树等数据结构中进行的一种搜索算法,简单来说就是从起点开始,一层层向周围扩展,直到找到终点。

示例代码:

public void BFS(Node root)
{
    Queue<Node> queue = new Queue<Node>();
    HashSet<Node> visited = new HashSet<Node>();

    queue.Enqueue(root);
    visited.Add(root);

    while(queue.Count > 0)
    {
        Node node = queue.Dequeue();
        Console.WriteLine(node.Value);

        foreach(Node neighbor in node.Neighbors)
        {
            if(!visited.Contains(neighbor))
            {
                queue.Enqueue(neighbor);
                visited.Add(neighbor);
            }
        }
    }
}

2.生产者和消费者模式:利用队列实现线程间的协作,生产者负责生产数据,消费者负责消费数据,共同维护一个队列,生产者将数据放入队列尾部,消费者从队列头部取出数据。

示例代码:

public class ProducerConsumer
{
    private Queue<int> queue = new Queue<int>();
    private object locker = new object();

    public void Produce()
    {
        while(true)
        {
            int number = GenerateNumber();

            lock(locker)
            {
                queue.Enqueue(number);
                Console.WriteLine("Produced: " + number);
            }

            Thread.Sleep(1000);
        }
    }

    public void Consume()
    {
        while(true)
        {
            int number;

            lock(locker)
            {
                if(queue.Count == 0)
                    continue;

                number = queue.Dequeue();
                Console.WriteLine("Consumed: " + number);
            }

            Thread.Sleep(2000);
        }
    }
}

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#栈和队列的简介,算法与应用简单实例 - Python技术站

(0)
上一篇 2023年5月31日
下一篇 2023年5月31日

相关文章

  • 详细分析c# 客户端内存优化

    详细分析C#客户端内存优化攻略 背景 C# 在客户端开发中越来越受到欢迎,但是 C# 程序在运行期间可能会占用大量内存,尤其是对于长时间运行、复杂逻辑的程序。因此,进行 C# 客户端内存优化显得尤为重要。 攻略 1. 使用 .NET Core .NET Core 作为一款快速、轻量级、跨平台的开发框架,可以有效降低 C# 客户端程序的内存占用,并且具有更优秀…

    C# 2023年6月6日
    00
  • C#使用foreach语句遍历集合类型的方法

    当我们需要遍历一个集合类型的时候,使用foreach语句比使用for循环更为方便,可以避免通过索引访问集合元素的困扰,提高了代码可读性,并且能够支持不同数据类型的集合类型。以下是关于C#使用foreach语句遍历集合类型的完整攻略。 1.基本语法 C#中使用foreach语句遍历集合类型的基本语法格式如下: foreach (var item in coll…

    C# 2023年6月7日
    00
  • C#常用字符串加密解密方法封装代码

    非常感谢您对C#常用字符串加密解密方法封装代码的关注。下面为您详细介绍如何实现该功能。 1. 基本概念 在介绍具体的代码实现之前,首先需要了解一些基本概念。 1.1 加密和解密 加密是指将原始的明文数据通过一定的算法转换为密文,以达到防止信息泄露的目的;而解密则是指将密文数据还原回原始的明文数据。 1.2 对称加密和非对称加密 对称加密是指加密和解密使用同一…

    C# 2023年6月7日
    00
  • C#中FormClosing与FormClosed的区别详细解析

    C#是一种非常流行的编程语言,常被用于开发Windows上的桌面应用程序。在Windows窗体应用程序中,我们会经常使用到FormClosing和FormClosed事件来监测窗体关闭的状态。但是,许多人对这两个事件的具体区别并不是很清楚。在本文中,我们将详细讲解这两个事件的区别及其使用示例。 FormClosing事件 当Windows窗体应用程序正在关闭…

    C# 2023年6月8日
    00
  • c#静态方法和非静态方法详细介绍

    下面是关于”C#静态方法和非静态方法详细介绍”的完整攻略。 什么是静态方法和非静态方法 C#中的方法可以分为静态方法和非静态方法。 静态方法定义在类中,可以直接通过类名来调用。非静态方法定义在类中,必须通过对象来调用。 以下是一个简单的示例,演示了一个类中包含一个静态方法和一个非静态方法: public class MyClass { public stat…

    C# 2023年6月7日
    00
  • BarCode条形码基于C# GDI+ 的实现方法详解

    首先,我们需要明确的是,使用C# GDI+可实现基于Windows操作系统的条形码生成。下面,将详细介绍使用C# GDI+库生成BarCode条形码的实现方法。 1. 安装C# GDI+库 在开始使用C# GDI+库之前,首先需要安装这个库。如果你使用的是Visual Studio等集成开发环境,那么这个库已经包含在内了,无需额外安装。如果你使用的是其他开发…

    C# 2023年6月7日
    00
  • C#各种异常处理方式总结

    C#各种异常处理方式总结 什么是异常? 异常是指在程序运行过程中遇到的错误或情况,可以是处理到了程序正常运行范围之外的数据输入或其他问题。 异常处理的意义 在编写程序时,我们需要预先考虑到可能出现的异常情况,以规避程序崩溃或数据丢失等问题。异常处理可以帮助我们及时捕获异常并进行处理,避免程序崩溃或数据不完整。 异常处理方式 C#提供了多种异常处理方式,包括使…

    C# 2023年5月15日
    00
  • C#中函数的创建和闭包的理解

    C#中函数的创建和闭包的理解 函数创建 声明函数 在C#中使用function关键字来声明一个函数,语法格式为: visibility return_type function_name(parameter_list) { // function body } visibility:可见性修饰符,指定函数的访问范围,可以是public、private、pro…

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