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#中的字符串就是一个常见的不可变对象。当对字符串进行修改时,实际上是创建了一个新的字符串对象…

    C# 2023年6月1日
    00
  • C#加密解密类实例程序

    以下是详细的“C#加密解密类实例程序”的攻略: 一、概述 在现代信息技术领域,数据加密已经成为很多应用的基本需求。为此,C#提供了一系列的加密解密类,比如MD5、SHA1、DES、AES等等。本文将主要介绍使用C#实现加密解密的方法,其中涉及到的加密算法是DES和AES。 二、加密解密实例 2.1 DES加密解密 DES是一种常用的对称加密算法,下面是一个使…

    C# 2023年5月31日
    00
  • 深入分析C#异步编程详解

    深入分析C#异步编程详解攻略 什么是异步编程 异步编程是一种在执行操作时不阻塞后续操作的编程模式。在异步编程中,当一个操作被提交时,它的控制被立即返回给调用者,而不需要等待操作的完成。当操作完成后,调用者可以通过回调或轮询的方式获取操作结果。在C#中,异步编程主要通过异步方法和任务的方式实现。 异步编程的优势 异步编程有以下优势: 提高程序的资源利用率 减少…

    C# 2023年6月3日
    00
  • 两种获取connectionString的方式案例详解

    下面是“两种获取connectionString的方式案例详解”的完整攻略: 概述 在使用ASP.NET的开发中,我们常常需要连接数据库,在连接数据库时,需要首先获取连接字符串。获取连接字符串的方式有很多种,本文将介绍两种常用的方式,分别是: 通过web.config文件获取连接字符串 通过代码获取连接字符串 通过web.config文件获取连接字符串 在A…

    C# 2023年5月31日
    00
  • C#保存图片到数据库并读取显示图片的方法

    整体思路 将图片转换为二进制,然后将二进制数据存储到数据库中,读取时从数据库中读取二进制数据,再将二进制数据转换为图片。 示范代码1:保存图片到数据库 首先,我们需要创建一个包含二进制数据的表格来存储图片。在该表格上创建两个字段:图片ID和图片内容。然后,使用下面的代码将图片转换为二进制数据,并将其插入到表格中: // 读取图片文件 FileStream f…

    C# 2023年6月2日
    00
  • c# datetime 格式化大全

    当涉及到 c# 的 datetime 格式化时,需要了解一些预定义的格式字符串、定界符和格式说明符。 预定义格式字符串 d 使用短日期格式显示日期:“yyyy/MM/dd” D 使用长日期格式显示日期:“yyyy’年’M’月’d’日’” f 使用长日期格式和短时间格式显示日期时间:“yyyy’年’M’月’d’日’ H:mm” F 使用长日期格式和长时间格式显…

    C# 2023年6月1日
    00
  • C#基础之泛型

    C#基础之泛型 什么是泛型 在C#中,泛型即“参数化类型”,即对数据类型进行参数化,使得能够在类型安全的前提下对不同的数据类型进行通用的操作。用一句话来概括就是,泛型即类型参数化。 泛型具有以下特点: 可以避免类型强转的问题。 提供更高效的代码复用,避免了针对不同类型创建不同版本的代码的问题。 增加代码可读性,因为泛型可以让我们不需要在代码中反复使用Obje…

    C# 2023年5月14日
    00
  • C#实现数独解法

    C#实现数独解法 简介 数独游戏是一种经典的逻辑推理游戏。在9*9个方格中,按照一定的规则填入数字,使得每行、每列、每宫都含有1-9的数字且不重复。本文将介绍如何使用C#实现数独解法。 准备 在开始编写代码之前,先准备好一个数独问题作为输入。例如: 0 0 0 0 6 7 5 2 0 7 0 0 0 0 5 0 0 4 0 0 0 2 0 0 0 0 9 0…

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