03-数据结构(一)

链接:C# 数据结构_哔哩哔哩_bilibili

https://www.bilibili.com/video/BV1a541147Nk/?spm_id_from=333.337.search-card.all.click&vd_source=6eb7d966aa03ff5cb02b63725f651e68

链接:使用 C#.Net 学习掌握数据结构 (更新中)_哔哩哔哩_bilibili

一个:

C#编程-第五季-数据结构和算法-宇宙最简单教程_哔哩哔哩_bilibili

C#编程-第六季-编程内功修炼-算法-宇宙最简单教程_哔哩哔哩_bilibili

一、数据结构

基础语法、  数据结构与算法、网络编程与多线程、网络通信、队列、WPF基础、Winform基础、数据库基础、容器、docker、prism框架。  WebApi。

RemoveAt:根据索引移除

1、列表

1.1、线性表

顺序表的存储:顺序表中的每个元素占w个存储单元,设第i个数据元素的存储地址为Local(ai)则有:Local(ai)=Local(a1)+(i-1)*w。也是顺序表的起始地址,顺序表的基地址,顺序表任意存取的特点,占用的是一组连续的存储空间,具有任意存取的特点,数组具有天生表示顺序表的数据存储区域的特性。

在这个例子中,索引器允许你通过索引来读取(get)和写入(setSeqList<T>中的元素。如果SeqList<T>没有索引器,并且你试图像数组一样使用它(即mySeqList[index]),编译器会报错,因为它不知道如何处理这样的语法。

因此,如果你在使用自定义集合类(如SeqList<T>)时遇到索引相关的错误,很可能是因为该类没有实现索引器,或者你尝试访问的索引超出了集合的有效范围。确保你的类正确实现了索引器,并在使用索引器时始终检查索引的有效性,以避免IndexOutOfRangeException异常。

代码:

  interface IList1<T>{int GetLength();void Clear();bool IsEmpty();void Add(T item);void Insert(T item, int index);T Delete(int index);//T this[int index] { get; }T GetEle(int index);int Locate(T value);}
 internal class SeqList<T> : IList1<T>{///  顺序表实现方式public T[] data;  //  存储数据public int count = 0;  //  表示存了多少个数据public SeqList(int size)   //  size最大容量{data = new T[size];}public SeqList() : this(10)  //  默认构造函数容量是10{}public T this[int index]{get { return GetEle(index); }}public void Add(T item){if (count == data.Length){Console.WriteLine("当前数组已存满,不允许再存");}else{data[count] = item;count++;}}public void Clear(){throw new NotImplementedException();}public T Delete(int index){T item = data[index];for(int i = index - 1; i < count - 1; i++){data[i] = data[i + 1];}count--;return item;}public T GetEle(int index){if (index >= 0 && index <= count - 1){return data[index];}else{Console.WriteLine("索引不存在");return default(T);  }}//  取得数据的长度public int GetLength(){return data.Length;}public void Insert(T item, int index){for(int i=count-1; i>=index; i--){data[i] = data[i-1];}}public bool IsEmpty(){throw new NotImplementedException();}public int Locate(T value){for (int i = 0; i < count-1; i++){if (data[i].Equals(value)){return i;}}return -1;  /// 表示值不存在;}}

2、链表

单链表和双链表:

2.1、单链表

单链表使用地址连续的存储单元顺序存储线性表中的各个数据元素,链式存储,链表不要求逻辑上相邻的数据元素在物理存储位置上页相邻,因此,在对链表进行插入和删除时不需要移动数据元素,但是同时页失去了顺序表可随机存储的有带你。

表头  数据  下一个数据的地址

    internal class Node1<T>{private T data;  //  存储元素private Node1<T> next;   // 用来指向下一个元素public Node1(T value){data = value;next = null;}public Node1(T value, Node1<T> next){this.data = value;this.next = next;}public Node1(){data=default(T);next= null;}public  Node1(Node1<T> next){this.next = next;}public T Data{get { return data; }set {  data = value; }}public Node1<T> Next{get { return next; }set { next = value; }}}

代码:

   interface IList1<T>{int GetLength();void Clear();bool IsEmpty();void Add(T item);void Insert(T item, int index);T Delete(int index);//T this[int index] { get; }T GetEle(int index);int Locate(T value);}
  internal class linkList<T> : IList1<T>{public Node1<T> head;   // 第一个节点public linkList() {head = null;}public void Add(T item){Node1<T> newNode = new Node1<T>(item);  //  根据新的数据创建新的节点if (head == null){head = newNode;}else{Node1<T> temp = head;while (true){if (temp.Next != null){temp = temp.Next;}else{break;}}temp.Next = newNode;}}public void Clear(){throw new NotImplementedException();}public T Delete(int index){T data;if (index == 0){data = head.Data;head = head.Next;return data;}else{Node1<T> temp = head;for (int i = 0; i < index; i++){temp = temp.Next;}data = temp.Next.Data;temp.Next = temp.Next.Next;return data;}}public T GetEle(int index){throw new NotImplementedException();}public int GetLength(){if(head==null) return 0;Node1<T> temp = head;int count = 1;while(temp != null){if(temp.Next != null){count++;temp= temp.Next;}else{break;}}return count;}public void Insert(T item, int index){Node1<T> newNode=new Node1<T>(item);if(index==0){newNode.Next = head;head= newNode;}else{Node1<T> temp=head;for (int i=0; i<index; i++){temp = temp.Next;}newNode.Next = temp.Next;temp.Next = newNode;}}public bool IsEmpty(){throw new NotImplementedException();}public int Locate(T value){Node1<T> temp = head;if (temp == null){return -1;}else{int index = 0;while (true){if (temp.Data.Equals(value)){return index;}else{if(temp.Next!= null){index++;temp = temp.Next;}else{break;}}}return -1;}}}

2.2、双链表

指向前一个节点,先进后除,,没有计数,

3、栈

3.1、顺序栈(Stack)

是操作元素限定在表的尾端进行的线性表,表尾由于要进行插入、删除等操作,所以,它具有特殊的含义,把表尾称为栈顶(Top)另一端固定,叫做栈底,当为空,脚空栈。

栈通常记为:S=(a1, a2, ...,an) a1为栈底元素,an为栈顶元素。a1到an依次入栈,出栈则次序相反,an第一个出栈,a1最后出栈。栈的操作是按照后进先出或现金后出的原则进行

 SeqList<string> strList = new SeqList<string>();strList.Add("123");strList.Add("456");strList.Add("789");Console.WriteLine("123456789");Console.WriteLine(strList[0]);Console.ReadLine();Console.WriteLine(strList);Console.WriteLine(strList.GetLength());for (int i = 0; i < strList.GetLength(); i++){Console.WriteLine(strList[i]);}Console.ReadLine();Stack<string> stack = new Stack<string>();stack.Push("a");stack.Push("b");stack.Push("c");Console.WriteLine(stack.Pop());Console.ReadLine();

代码:  类似于数组,用数组构造栈的先进后出

    interface IsStackDS<T>{int Count { get; }int GetLength();bool IsEmpty();void Clear();void Push(T item);T Pop();T Peek();}
    internal class seqStack<T> : IsStackDS<T>{private T[] data;private int top;public seqStack(int size){data = new T[size];top = -1;}public int Count { get { return top+1; } }public void Clear(){top=-1;}public int GetLength(){return Count;}public bool IsEmpty(){return Count==0;}public T Peek(){throw new NotImplementedException();}public T Pop(){T temp = data[top];top--;return temp;}public void Push(T item){data[top+1]=item;top++;}}

3.2、链栈

栈顶Top   为Node1 类  出栈时候指向下一个Node1

其他和单链表类似:

代码: 但是用链表的形式描述栈的先进后出,需要用到类节点   Node

    internal class linkStack<T> : IsStackDS<T>{private T data;private Node1<T> top;private int count;//public seqStack(int size)//{//    data = ;//    top = null;//}public int Count { get { return count; } }public void Clear(){top = null;count = 0;}public int GetLength(){return Count;}public bool IsEmpty(){return Count == 0;}public T Peek(){throw new NotImplementedException();}public T Pop(){data = top.Data;top=top.Next;count--;return data;}public void Push(T item){Node1<T> newNode = new Node1<T>(item);newNode = new Node1<T>(item);top.Next = top;top = newNode;count++;}

4、队列

代码:队头  队尾  ,先进先出,front 先出,有计数:count。

4.1、顺序队列

用以连片的存储空间老存储队列中的数据元素,这样的队列称为顺序队列(Sequence   Queue)。类似于顺序栈,

代码:需要设置数组的大小

    interface IsQueueDS<T>{int Count {  get; }int GetLength();bool IsEmpty();void Clear();void Enqueue(T item);T Dequeue();T Peek();}
  internal class seqQueue<T> : IsQueueDS<T>{private T[] data;private int count;private int front;  //  队首,从  -1 开始private int rear;  //  队尾public seqQueue(int size){data=new T[size];count = 0;front = -1;rear = -1;}public int Count { get { return count; } }public void Clear(){count=0;}public T Dequeue(){if (count >0){T temp = data[front + 1];front++;count--;return temp;}else{Console.WriteLine("无法取得,队列为空");return default(T);}}public void Enqueue(T item){if (count == data.Length){Console.WriteLine("队列已经满了");}else{if(rear==data.Length-1)  //  判断是否在末尾,从头开始{data[0]=item;rear = 0;}else{data[rear + 1] = item;rear++;}}}public int GetLength(){return count;}public bool IsEmpty(){return count == 0 ;}public T Peek(){T temp=data[front+1];return temp;}}

4.2、链队列

表与链,  栈与队列,不需要设置数组的大小

 internal class Node1<T>{private T data;  //  存储元素private Node1<T> next;   // 用来指向下一个元素public Node1(T value){data = value;next = null;}public Node1(T value, Node1<T> next){this.data = value;this.next = next;}public Node1(){data=default(T);next= null;}public  Node1(Node1<T> next){this.next = next;}public T Data{get { return data; }set {  data = value; }}public Node1<T> Next{get { return next; }set { next = value; }}}

代码:

    interface IsQueueDS<T>{int Count {  get; }int GetLength();bool IsEmpty();void Clear();void Enqueue(T item);T Dequeue();T Peek();}
    internal class linkQueue<T> : IsQueueDS<T>{private Node1<T> front;private Node1<T> rear;private T data;private int count;public linkQueue(){front = null;rear = null;count = 0;}public int Count {  get { return count; } }public void Clear(){front = null;rear = null ;count = 0;}public T Dequeue(){if (count == 0){Console.WriteLine("为空无法出队列");return default(T);}else if(count == 1){T temp = front.Data;front = null;rear = null;count = 0;return temp;}else{T temp = front.Data;temp=front.Data;front=front.Next;count--;return temp;}}public void Enqueue(T item){Node1<T> newNode = new Node1<T>(item);if (count == 0){front = newNode;count = 1;rear= newNode;}else{rear.Next = newNode;rear = newNode;count++;}}public int GetLength(){return count;}public bool IsEmpty(){return count == 0 ;}public T Peek(){return front.Data;}}

5、字符串

字符串类的创建

6、数组

数组的创建:



7、算法

算法:

7.1、快速排序

作为排序依据的数据项称为  ”排序项“,也成为记录的  ”关键码“,关键码分为主关键码和次关键码。一般地,若关键码是主关键码,则对于任意排序的序列,经排序后得到的结果是唯一的;弱为次关键码,排序结果不唯一,这是因为待排序的序列中可能存在具有相同关键码的记录。此时,这些记录在排序结果中,他们之间的位置关系与排序前不一定保持一致。如果使用某个排序方法对任意的记录序列关键码进行排序,形同关键码值得记录之间得位置关系与排序前一致,则称此排序方法是稳定的,如果不一致,则称此排序方法是不稳定的。

由于待排序得记录得数量不同,使得排序过程中设计得存储器不同,可将排序方法分为内部排序和外部排序两大类。

内部排序值得是在排序过程中,记录全部存放在计算机得内存中,并在内存中调整记录之间得相对位置,在此期间没有进行内、外存的数据交换。外部排序指的是在排序过程中,记录得主要部分存放在外存中,借助于内存逐步调整记录之间得相对位置。在这个过程中,需要不断地在内外存之间交换数据。

排序:排序项,

快速排序:

7.1.1、直接插入排序

双重循环,逐个比较排序,直接拿后一个与前边所有去比较

7.1.2、冒泡排序

将相邻得记录得关键码进行比较,若前边记录的关键码大于后边记录的关键码,则将它们交换,否则不交换。需要操作N-1次,,N为元素个数。

7.1.3、简单选择排序

先将第一个作为比较直,与后边得所有元素中得最小值比较,然后交换位置。

7.1.4、快速排序

先取得一个基数,即0位置,,然后从后索引找到比它小的,再从前往后找比它小的。

直到基数放在某个位置使得将数组分为两个部分。前边都比基数小,后边都比基数大。

internal class Program
{static void QuickSort(int[] dataArray,int left,int right){if(left<right){int x = dataArray[left];int i = left;int j = right;while(true&&i<j){while (true && i < j){if (dataArray[j] <= x){dataArray[i] = dataArray[j];break;}else{j--;}}while (true && i < j){if ((dataArray[i] >x)){dataArray[j] = dataArray[i];break;}else{i++;}}}//  此时i==j找到中间位置dataArray[i] = x;QuickSort(dataArray,left,i-1);QuickSort(dataArray,i+1,right);}}static void Main(string[] args){int[] data = new int[] { 42, 20, 17, 27, 13, 8, 17, 48 };QuickSort(data,0,data.Length-1);foreach(var temp in data){Console.WriteLine(temp);}}

7.1、二叉树

算法、重点

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/837984.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CheckStyle静态样式之道

优质博文&#xff1a;IT-BLOG-CN 在标准化的统一样式检查规范里&#xff0c;最为常用的统一样式工具是checkstyle插件&#xff0c;而不是国内阿里的代码规约插件。 【1】下载插件 【2】配置生效 配置生效及告警设置 【3】配置checkstyle.xml 官网地址 官网最新Releases 下面…

模拟量电机控制器PWM 输出隔离转换器4-20mA/0-5V/0-10V转50Hz/100Hz/1KHz/10KHz/100KHz

主要特性: 精度、线性度误差等级&#xff1a; 0.1、0.2、0.5 级4-20mA/0-5V/0-10V 等标准信号输入可选择RS485 通讯输入&#xff0c;支持 Modbus 协议PWM 信号输出&#xff0c;PWM 频率可选PWM 输出驱动能力可达 5A信号输入/信号输出 3000VDC 隔离可选择一进一出&#xff0c;一…

OpenAI 震撼发布:GPT-4o免费,实时语音视频交互开启新纪元

OpenAI 震撼发布&#xff1a;GPT-4o免费&#xff0c;实时语音视频交互开启新纪元 在仅仅问世17个月后&#xff0c;OpenAI 研制出了仿佛科幻片中登场的超级人工智能——GPT-4o&#xff0c;而且所有人都可以完全免费使用&#xff0c;让这个科技界的巨浪让人震撼无比&#xff01;…

真JAVA代码审计之XSS漏洞

Part1 漏洞案例demo&#xff1a; 没有java代码审计XSS漏洞拿赏金的案例。 所以将就看看demo吧 漏洞原理&#xff1a;关于XSS漏洞的漏洞原理核心其实没啥好说的&#xff0c;网上一查一大堆。 反射性XSS漏洞 <% page language"java" contentType"text/ht…

图搜索算法-最短路径算法-贝尔曼-福特算法

相关文章&#xff1a; 数据结构–图的概念 图搜索算法 - 深度优先搜索法&#xff08;DFS&#xff09; 图搜索算法 - 广度优先搜索法&#xff08;BFS&#xff09; 图搜索算法 - 拓扑排序 图搜索算法-最短路径算法-戴克斯特拉算法 贝尔曼-福特算法&#xff08;Bellman-Ford&#…

克鲁斯CLOOS机器人维修知识分享

克鲁斯工业机器人是一种高度精密的自动化设备&#xff0c;广泛应用于制造业、物流等领域。为了确保机器人的正常运行&#xff0c;了解一些基本的CLOOS工业机械手维修知识是必不可少的。 【常见CLOOS机械臂故障及解决方法】 1. 机器人无法启动&#xff1a;检查电源是否正常&…

Milvus 安装与配置

一、环境准备 在安装 Milvus 之前&#xff0c;确保你的系统满足以下要求&#xff1a; 操作系统&#xff1a;Milvus 支持 Linux 操作系统&#xff0c;如 Ubuntu、CentOS 等。硬件资源&#xff1a;推荐使用具有足够 CPU、内存和 SSD 存储的机器。对于大规模数据集&#xff0c;高…

5---Linux小程序“进度条”及缓冲区的概念(逻辑梳理,轻松理解)

一、缓冲区的解析&#xff1a; 1.1论点的引入&#xff1a; 在Linux中有一个接口sleep&#xff0c;可以使得C/C程序休眠一段指定的时间。他需要依赖的头文件是<unistd.h>&#xff0c;注意这个接口为Linux私有。 usleep接口类似sleep接口&#xff0c;但是单位为微秒。下面…

计算机视觉中的计算几何

计算几何领域出现于 20 世纪 70 年代&#xff0c;研究解决几何问题的数据结构和算法。这尤其包括确定图像内的拓扑结构&#xff0c;或者实际上是更高维的表示&#xff0c;例如点邻域&#xff0c;这可以帮助从数字图像数据等中导出几何意义[1]。 计算机视觉主要涉及静态或动态图…

JAVA实验项目(一):JAVA面向对象特征性实验

Tips&#xff1a;"分享是快乐的源泉&#x1f4a7;&#xff0c;在我的博客里&#xff0c;不仅有知识的海洋&#x1f30a;&#xff0c;还有满满的正能量加持&#x1f4aa;&#xff0c;快来和我一起分享这份快乐吧&#x1f60a;&#xff01; 喜欢我的博客的话&#xff0c;记得…

C++ | string详解

1、string是什么 string是STL文档的容器之一&#xff0c;是一个自定义类型&#xff0c;是一个类&#xff0c;由类模板basic_string实例化出来的一个类&#xff1b; 类模板basic_string实例化出来了四个类&#xff0c;如下图所示&#xff1b; 实例化出的这四个类不同的是他们的编…

HI-TOP网关HT3S-DCS-MDN在半导体生产线中的RS232温控器与DeviceNet主机台通讯整合应用案例

一、项目背景 在半导体生产线的温度控制环节中&#xff0c;传统的RS232温控器因其稳定的性能和广泛的应用而占据重要地位&#xff0c;然而&#xff0c;由于不同设备厂商使用的通讯协议和标准各异&#xff0c;导致设备间的信息交换存在障碍。温控器的精确控制、设备的互联互通和…

YOLOv8独家改进:逐元素乘法(star operation)二次创新 | 微软新作StarNet:超强轻量级Backbone CVPR 2024

💡💡💡创新点:star operation(元素乘法)在无需加宽网络下,将输入映射到高维非线性特征空间的能力,逐元素乘法(star operation)在性能上始终优于求和,基于star operation块做二次创新 💡💡💡如何跟YOLOv8结合:替代YOLOv8的C2f,结构图如下 收录 YOLOv8…

PyQt5编写的一个简易图像处理软件

文章目录 1. 简介2. 准备工作3. 主界面设计4. 功能构建5. 总结 1. 简介 通过编写简易图像处理软件&#xff0c;你可以学习如何使用 PyQt5 构建用户界面&#xff0c;以及如何与用户交互。同时&#xff0c;你还可以学习图像处理技术&#xff0c;如图像读取、傅里叶变换、滤波、增…

Ansible自动化运维中的User用户管理模块应用详解

作者主页&#xff1a;点击&#xff01; Ansible专栏&#xff1a;点击&#xff01; 创作时间&#xff1a;2024年5月14日14点12分 在Ansible中&#xff0c;user 模块主要用于管理系统用户账户。它可以创建、修改、删除用户&#xff0c;并管理用户的属性&#xff0c;比如密码、…

玩机进阶教程------MTK机型重置账号 去除FRP 去除开机密码 清除数据的几种方法步骤解析

目前的机型不管是高通芯片还是MTK芯片。都有账号类限制。包含云账号 frp账号和开机密码等等,他们在线刷包中对应的分区是不同的。例如针对开机图案密码这些,有些机型靠简单的恢复出厂是无效果的,其实对应的解决方法很简单。今天将针对MTK芯片机型的账号问题做个步骤解析。 …

Selenium 自动化 —— 四种等待(wait)机制

更多关于Selenium的知识请访问CSND论坛“兰亭序咖啡”的专栏&#xff1a;专栏《Selenium 从入门到精通》 ​ 目录 目录 需要等待的场景 自己实现等待逻辑 Selenium 提供的三种等待机制 隐式等待&#xff08;Implicit Waits&#xff09; 隐式等待的优点 隐式等待的缺点 …

pycharm如何有效读取到win10设置的环境变量

参考链接&#xff1a; 参考文章 该参考文章的第一种方法&#xff1a;设置win10环境变量。 在设置完环境变量后&#xff0c;在pycharm终端上不能有效读取到刚刚设置的环境变量的&#xff0c;需要启动win的cmd&#xff0c;在项目路径下执行脚本。如下所示的对比&#xff1a; cm…

金航标kinghelm萨科微slkor公司发展和品牌传播

为了金航标kinghelm萨科微slkor公司发展和品牌传播&#xff0c;推出了”金航标每日芯闻“与“萨科微每日芯闻“栏目&#xff0c;影响力非常好。这一构想并非一时的灵光乍现&#xff0c;而是经过深思熟虑和充分调研的结果。制定该栏目的模板时候时&#xff0c;就明确了要求语音版…

棒材直线度测量仪 专为圆形产品研发设计 在线无损检测

棒材直线度测量仪采用了先进的技术&#xff0c;能够实现在线无损检测&#xff0c;为生产过程提供了极大的便利。专为圆形产品设计&#xff0c;它能够精确测量棒材的米直线度及外径、椭圆度尺寸&#xff0c;为质量控制提供可靠的数据支持。 在线直线度测量仪不仅具有出色的性能…