03-数据结构(一)

news2024/12/23 14:38:44

链接: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.coloradmin.cn/o/1677325.html

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

相关文章

aws s3

列出关键点 创建s3 设置s3策略&#xff0c;所有人访问 { "Version": "2012-10-17", "Statement": [ { "Sid": "VisualEditor1", "Effect": "Allow", …

【美团面试2024/05/14】前端面试题滑动窗口

一、题目描述 设有一字符串序列 s&#xff0c;确定该序列中最长的无重复字母的子序列&#xff0c;并返回其长度。 备注 0 < s.length < 5 * 104 s 由英文字母、数字、符号和空格组成 示例1 输入 s "abcabcbb" 输出 3 二、原题链接 这道题在LeetCode上的原题链…

【C语言】4.C语言数组(2)

文章目录 6. 二维数组的创建6.1 ⼆维数组的概念6.2 ⼆维数组的创建 7. 二维数组的初始化7.1 不完全初始化7.2 完全初始化7.3 按照⾏初始化7.4 初始化时省略⾏&#xff0c;但是不能省略列 8. 二维数组的使用8.1 ⼆维数组的下标8.2 ⼆维数组的输⼊和输出 9. 二维数组在内存中的存…

基于 Spring Boot 博客系统开发(九)

基于 Spring Boot 博客系统开发&#xff08;九&#xff09; 本系统是简易的个人博客系统开发&#xff0c;为了更加熟练地掌握 SprIng Boot 框架及相关技术的使用。&#x1f33f;&#x1f33f;&#x1f33f; 基于 Spring Boot 博客系统开发&#xff08;八&#xff09;&#x1f…

day15 个人博客项目登录验证CookieSession验证码安全

知识点 1.后台验证-登录用户逻辑安全 2.后台验证-cookie和session 3.后台验证-验证码和万能密码 通常的后台验证登录都是&#xff0c;1.发送登录请求&#xff0c;账户密码&#xff1b;2.接受账号密码3.对账号密码进行判断 正确 -》跳转到成功登录界面 失败-》重新登录 而…

C++ | Leetcode C++题解之第90题子集II

题目&#xff1a; 题解&#xff1a; class Solution { public:vector<int> t;vector<vector<int>> ans;vector<vector<int>> subsetsWithDup(vector<int> &nums) {sort(nums.begin(), nums.end());int n nums.size();for (int mask …

无人机+应急通信:灾害现场应急通信车技术详解

无人机和应急通信车是灾害现场应急通信中的重要技术。无人机可以通过快速到达灾害现场&#xff0c;搭载高清摄像头、红外热成像仪、激光雷达等设备&#xff0c;对灾区进行实时监测和灾情评估&#xff0c;同时也可以通过搭载的通信设备&#xff0c;与指挥中心进行实时通信和数据…

HC-Net: 自动牙周疾病诊断的混合分类网络

文章目录 HC-Net: Hybrid Classification Network for Automatic Periodontal Disease Diagnosis摘要方法实验结果 HC-Net: Hybrid Classification Network for Automatic Periodontal Disease Diagnosis 摘要 从全景X射线图像中准确分类牙周病对于临床高效诊疗至关重要&…

胖东来5月生鲜陈列欣赏

【免责声明】&#xff1a;凡未注明来源的图文内容&#xff0c;版权归原作者所有。本平台所发稿件、图片均用于学习交流&#xff0c;不代表赞同文章观点和对其真实性负责&#xff0c;不用作商业用途。若文章涉及版权&#xff0c;请将马上联系&#xff0c;安排删除。

Andorid Input事件 注入方法及原理介绍

在Android系统中&#xff0c;除了真实的输入设备可以产生事件之外&#xff0c;我们也可以通过软件的方式&#xff0c;模拟一个输入事件&#xff0c;比如模拟一个点击事件&#xff0c;模拟一个按键事件等等。 怎么模拟一个输入事件 1&#xff0c;在adb命令行使用input命令模拟输…

Milvus的系统架构

简介 Milvus的构建在许多知名的向量搜索库比如Faiss, HNSW, DiskANN, SCANN等之上的&#xff0c;它针对稠密向量数据集的相似搜索而设计&#xff0c;能支持百万、十亿甚至万亿级别的向量搜索。 Milvus支持数据分片&#xff0c;流式数据插入&#xff0c;动态schema&#xff0c…

仿C#或Java基础类型自定义

class Int{ private:int _value 0; public:operator int() const{ // 隐式转换return _value;}// 显式转换explicit operator int*() const { return nullptr; }operator(const int page){_value page;}operator float() const{return static_cast<float>(_value);}ope…

Linux shell编程学习笔记49:strings命令

0 前言 在使用Linux的过程中&#xff0c;有时我们需要在obj文件或二进制文件中查找可打印的字符串&#xff0c;那么可以strings命令。 1. strings命令 的功能、格式和选项说明 我们可以使用命令 strings --help 来查看strings命令的帮助信息。 pupleEndurer bash ~ $ strin…

Node.js安装及环境配置(超详细!保姆级!!)

目录 一、进入官网地址下载安装包 二、安装程序 三、环境配置 四、测试 五、安装淘宝镜像 一、进入官网地址下载安装包 Node.js — Download Node.js (nodejs.org) 选择对应你系统的 node.js 版本&#xff0c;我选择的是Windows系统&#xff0c;64位 点击图中选项&#…

图文详解JUC:Wait与Sleep的区别与细节

目录 一.Wait() 二.Sleep() 三.总结Wait()与Sleep()的区别 一.Wait() 在Java中&#xff0c;wait() 方法是 Object类中的一个方法&#xff0c;用于线程间的协作。当一个线程调用wait() 方法时&#xff0c;它会释放对象的锁并进入等待状态&#xff0c;直到其他线程调用相同对…

【氮化镓】p-GaN 栅 HEMT栅极可靠性及其退化机制

文章作者团队来自中国科学院苏州纳米技术与纳米仿生研究所&#xff08;SINANO&#xff09;的关键实验室、中国科学技术大学的纳米技术与纳米仿生学院&#xff0c;以及广东省&#xff08;佛山&#xff09;苏州纳米技术与纳米仿生研究所的分支机构。研究结果发表在IEEE Journal o…

详解lighthouse通过命令行方式运行并生成html测试报告的方法

lighthouse可以通过命令行的方式运行并生成html报告&#xff0c;我们可以通过lighthouse --help 命令查看命令行的详细用法&#xff0c;在这里我仅列出最常用的命令行使用方法&#xff01; 常用lighthouse命令行参数详解 * --chrome-flags&#xff1a;传递自定义标志给Chrome…

网络安全法中关于网络信息的保护和监管,有哪些规定?

网络安全法作为我们数字时代的重要法律保障&#xff0c;对于网络信息的保护和监管有着明确且详细的规定。这些规定不仅体现了国家对于网络安全的重视&#xff0c;也为我们每个人在数字世界中提供了坚实的法律屏障。 首先&#xff0c;我们来看一个关于网络运营者主体责任的案例。…

摸鱼大数据——Linux搭建大数据环境(集群免密码登录和安装Hadoop)二

集群设置免密登录 克隆node1虚拟机的前置条件&#xff1a;node1虚拟机存在且处于关闭状态 1.克隆出node2虚拟机 1.node1虚拟机: 右键 -> "管理" -> "克隆" 2.图形化弹窗中: "下一页"->"下一页"->选择"创建完整克隆&…

Element Plus组件库使用组件自动导入后样式不生效的问题

首先按照官方文档上的介绍进行配置&#xff1a;快速开始 | Element Plus (element-plus.org) 配置完成后&#xff0c;去组件中去测试组件库中的button组件的样式是否生效 <template><el-button type"primary">Primary</el-button> </template&…