首页 > 编程语言 >【C#进阶】高级数据结构和算法_2024-06-22

【C#进阶】高级数据结构和算法_2024-06-22

时间:2024-06-22 11:43:57浏览次数:14  
标签:arr 06 进阶 22 int static myQueue Console public

当我们深入到编程的世界,我们会发现,掌握高级数据结构和算法就像是拥有了一套高级工具箱,它们能帮助我们更高效、更优雅地解决问题。今天,我们就来一探究竟,看看这些高级工具是如何工作的。

首先,让我们来谈谈高级数据结构

数据结构就像是我们用来存放东西的容器,高级数据结构就是一些更复杂的容器。

它们就像是我们编程中的“存储神器”,能让我们以不同的方式组织和访问数据。比如:

  • ,它就像是一个只能从顶部放入和取出物品的容器,遵循“后进先出”的原则。
  • 队列,它则像是一个有序的队伍,遵循“先进先出”的规则。
  • 链表,它则提供了一种灵活的方式来存储数据,每个数据点都指向下一个数据点,形成一个链条。

1. 栈、队列、链表

栈(Stack)

想象一下你叠盘子。每次新放一个盘子都在最上面,拿走的时候也只能从最上面开始拿。这就是栈,后进先出(LIFO, Last In First Out)的数据结构。

// C#中使用Stack<T>类实现栈
using System.Collections.Generic;

public class StackExample
{
    public static void Main()
    {
        Stack<int> myStack = new Stack<int>();
        
        // 入栈:像叠盘子一样添加元素
        myStack.Push(1);
        myStack.Push(2);
        myStack.Push(3);
        
        Console.WriteLine("Top element: " + myStack.Peek()); // 查看但不移除顶部元素
        
        // 出栈:移除并返回顶部元素
        while (myStack.Count > 0)
        {
            Console.WriteLine("Popped: " + myStack.Pop());
        }
    }
}

队列(Queue)

想象排队买票,先来的先买,后来的后买。队列就是这样的,先进先出(FIFO, First In First Out)。

// 使用Queue<T>类实现队列
using System.Collections.Generic;

public class QueueExample
{
    public static void Main()
    {
        Queue<string> myQueue = new Queue<string>();
        
        // 入队:像排队一样加入元素
        myQueue.Enqueue("Alice");
        myQueue.Enqueue("Bob");
        myQueue.Enqueue("Charlie");
        
        Console.WriteLine("Front of queue: " + myQueue.Peek()); // 查看队首但不移除
        
        // 出队:移除并返回队首元素
        while (myQueue.Count > 0)
        {
            Console.WriteLine("Dequeued: " + myQueue.Dequeue());
        }
    }
}

链表(LinkedList)

链表就像是一串用绳子串起来的珠子,每个珠子(节点)都连着下一颗珠子。它不像数组那样连续存储,所以插入和删除操作更快,但访问特定位置的元素较慢。

// 使用LinkedList<T>类实现链表
using System.Collections.Generic;

public class LinkedListExample
{
    public static void Main()
    {
        LinkedList<int> myList = new LinkedList<int>();
        
        // 插入节点
        myList.AddFirst(3);      // 在头部添加
        myList.AddLast(5);       // 在尾部添加
        myList.AddBefore(myList.First, 2); // 在第一个元素前添加
        
        // 遍历链表
        foreach (int value in myList)
        {
            Console.WriteLine(value);
        }
    }
}

2. 排序和搜索算法

接下来是排序和搜索算法,它们是我们在处理大量数据时的好帮手。排序算法帮助我们把数据排成有序的序列,而搜索算法则帮助我们快速找到所需的数据。

排序算法(以冒泡排序为例)

冒泡排序就像是玩扑克牌,每次比较相邻两张,如果顺序不对就交换,一轮轮下来,最大的牌就像泡泡一样浮到最上面。

public static void BubbleSort(int[] arr)
{
    int n = arr.Length;
    for (int i = 0; i < n - 1; i++)
    {
        for (int j = 0; j < n - 1 - i; j++) // 每轮少比较一次
        {
            if (arr[j] > arr[j + 1]) // 如果前一个大于后一个,交换
            {
                int temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
            }
        }
    }
}

搜索算法(线性搜索)

线性搜索就像是在书架上找一本书,从头开始一本本检查,直到找到为止。

public static int LinearSearch(int[] arr, int target)
{
    for (int i = 0; i < arr.Length; i++)
    {
        if (arr[i] == target)
        {
            return i; // 找到了,返回位置
        }
    }
    return -1; // 没找到,返回-1
}

3. 泛型编程

最后,我们还有泛型编程,这是一种编写代码的方式,它允许我们创建可以处理多种数据类型的组件,使得代码更加通用和灵活。

比如能够处理多种数据类型的代码,不用为每种类型重复写相似逻辑。就像制作一个“万能模具”,不管是做蛋糕还是面包,只要换原料就行。

// 泛型方法示例
public static T Max<T>(T a, T b) where T : IComparable<T>
{
    return a.CompareTo(b) > 0 ? a : b;
}

public static void Main()
{
    Console.WriteLine(Max(10, 20));    // 整数比较
    Console.WriteLine(Max("apple", "banana")); // 字符串比较
}

通过泛型,我们让Max方法既能比较整数大小,也能比较字符串的字典序,无需为每种类型单独写函数。

标签:arr,06,进阶,22,int,static,myQueue,Console,public
From: https://www.cnblogs.com/Jason54/p/18262048

相关文章

  • Midas Civil2022安装使用教程
    MidasCivil是一款先进的桥梁与土木工程结构分析设计软件,专为桥梁工程师打造。它集成了强大有限元分析引擎,支持从初步设计到详细设计全过程,提供桥梁结构静力分析、动力分析、稳定性评估、抗震设计等功能。用户通过直观界面,能够高效建模、仿真各类复杂工况,确保结构安全性与经济......
  • [题解]AT_abc225_f [ABC225F] String Cards
    思路Part1弱化版看到这道题的第一眼想到了P1012这道题。但是,这两道题选择的数量是有区别的。我们可以由拼数得出一个结论性的排序规则(这里就不多做解释了):inlineboolcmp(stringa,stringb){returna+b<b+a;}如果用这样的做法,有hack。Part2状态......
  • [题解]AT_abc225_e [ABC225E] フ
    思路对于每一个7,我们都可以抽象为这样一个图形:如果有两个7,无论它是否有重合部分,红色部分是不需要判断的,只需要看绿色的部分。因此,我们的问题就简化为了三角形,而不是四边形。对于所有的7,都有一个公共顶点:\((0,0)\)点。所以,我们可以引出一个叫斜率的概念来判断这些三角形......
  • [题解]AT_abc225_d [ABC225D] Play Train
    题意给定\(N\)个小车,每个小车的编号分别为:\(1,2,\dots,N\)。现在有\(Q\)个操作,每个操作执行\(3\)种操作:1xy,将\(x\)和\(y\)相连。(\(y\)在\(x\)之后)2xy,将\(x\)和\(y\)的连接解除。3x,输出\(x\)所在链的长度,及其这条链中的所有元素。(从前往后)思路我......
  • [题解]AT_abc224_e [ABC224E] Integers on Grid
    比较符合CCF造数据水平的题。思路首先可以用两个vector<pair<int,int>>v[N]分别将每一行、每一列的元素的权值与编号存储下来。那么可以对所有的\(v_i\)按照权值从小到大排序。那么发现对于所有的满足v[i][p].fst<v[i][q].fst的\((p,q)\)都可以建一条从\(p\)指......
  • [题解]AT_abc222_f [ABC222F] Expensive Expense
    板子题,模拟赛场切了。思路线段树换根板子题。因为需要求每一个点的答案,所以定义\(dp_i\)表示以\(i\)为根的最长距离。考虑将一个点\(v\)转化为根,树的形态会发生什么变化(假设\(v\)的父亲节点是\(u\))。发现在\(v\)子树中的节点,距离都会减少\(w_{u\tov}\),其它节点......
  • 063java jsp ssm企业员工培训管理系统员工培训计划培训记录管理(源码+数据库+文档)
    项目技术:Spring+SpringMVC+MyBatis等等组成,B/S模式管理等等。环境需要1.运行环境:最好是javajdk1.8,我们在这个平台上运行的。其他版本理论上也可以。2.IDE环境:IDEA,Eclipse,Myeclipse都可以。推荐IDEA;3.tomcat环境:Tomcat7.x,8.x,9.x版本均可4.硬件环境:windows7/8/10......
  • 061java jsp ssm共享充电宝管理系统(源码+数据库+文档)
     项目技术:Spring+SpringMVC+MyBatis等等组成,B/S模式管理等等。环境需要1.运行环境:最好是javajdk1.8,我们在这个平台上运行的。其他版本理论上也可以。2.IDE环境:IDEA,Eclipse,Myeclipse都可以。推荐IDEA;3.tomcat环境:Tomcat7.x,8.x,9.x版本均可4.硬件环境:windows7/8/1......
  • 代码随想录算法训练营第十四天 | 226.翻转二叉树 101.对称二叉树 104.二叉树的最大深
    226.翻转二叉树题目:给你一棵二叉树的根节点root,翻转这棵二叉树,并返回其根节点。解题:思路:遍历的过程中交换每个节点的左右孩子。选择哪种遍历方式?中序不行,左中右,左边子节点交换完,处理中间交换了左节点和右节点,再处理右节点去交换时这个右节点就是原来的左节点,所以有一边就一......
  • 【愚公系列】《短视频生成与剪辑实战》006-用Al文案生成视频
    ......