学习笔记 --C#基础其他知识点(数据结构)

C#中的数据结构《二》--视频学习笔记

在数据结构的分类:

1.集合 2.线性 3.树形 4.图状结构

数据结构是数据在程序中的存储结构,和基本的数据操作

算法:解决问题的解决思路,基于数据结构

本课程包括:线性表,栈和队列,串和数组,简单的排序方法,快速排序

1.线性表:

一对一线性关系,位置有先后关系,一个接着一个排列的数据结构

(C#)CLR中的线性表:

1.提供了一个非泛型接口IList接口,接口中的项是object,实现了IList的类有:ArrayList,ListDictionary,StringCollection,StringDictionary。

2.提供了泛型的IList接口,实现了List接口的类有List【重要】

使用:

csharp 复制代码
//1.使用list线性表
List<string> strlist = new List<string>();
//存入数据
strlist.Add("1");   //0
strlist.Add("2");   //1
strlist.Add("3");   //2
strlist.Add("4");   //3
//读出数据
Console.WriteLine(strlist[3]);  //通过索引器访问元素
//移除字符串
strlist.Remove("4");    //根据内容移除
strlist.Remove(strlist[3]);     //根据索引移除
//大小
Console.WriteLine(strlist.Count);
//清空数据
strlist.Clear();

⭐如果自己去实现一个线性表,如何去实现?

线性表的实现方式有下面几种:顺序表,单链表,双向链表,循环链表。

⭕顺序表:是最简单的存储结构,把表中的元素一个接一个地放进内存,特点:表中相邻的数据元素在内存中的存储位置也相邻。

写一个新的接口:IListDS(接口一般以I开头)【同时也使用泛型编程和接口】

csharp 复制代码
namespace List_T_Study
{
    interface IListDS<T>    //泛型接口
    {
        int GetLength();
        void Clear();
        bool IsEmpty();
        void Add(T item);
        void Insert(int index, T item);
        T Delate(int index);
        T this[int index] {  get;  }    //索引
        T GetEle(int index);    //根据索引得到值
        int Locate(T value);    //根据值得到索引
    }
}

以顺序表为例,实现接口,继承IListDS接口之后,实现全部的接口函数

由于篇幅原因,只显示

csharp 复制代码
namespace List_T_Study
{
    //顺序表的实现方式
    class SeqList<T> : IListDS<T>
    {
        private T[] data;   //用来存储数据
        private int count = 0;  //表示存了多少个数据
        public SeqList(int size)
        {
            //传入固定大小【最大容量】,不提供自动扩容的功能(系统中的list有自动扩容的功能)
            data = new T[size];
        }
        public SeqList():this (10) //默认构造函数 容量为10
        {
        }
        public T this[int index] => throw new NotImplementedException();

        //添加
        public void Add(T item)
        {
            if (count == data.Length)   //说明当前顺序表已经存满了,不允许再存入
            {
                Console.WriteLine("当前顺序表已经存满了,不允许再存入");
            }
            else
            {
                data[count] = item;
                count++;
            }
        }

        public T GetEle(int index)
        {
            if(index>=0 && index<=count-1)  //当索引存在
                return data[index];
            else
            {
                Console.WriteLine("索引不存在");
                return default(T);
            }
        }

        //取得数据的个数
        public int GetLength()
        {
            return count;
        }
    }
}

⭕单链表:

顺序表在插入删除时需要移动元素来实现,影响了运行效率,链表不要求逻辑上相邻的数据元素在物理存储位置上也相邻,但也同时失去了顺序表可随机存储的优点。

先定义一个节点的类:Node

然后再新建一个LinkList的类,类似顺序表继承IListDS接口,并实现接口的函数。

⭕双向链表:

prev指针,data存储数据,next指针

⭕循环链表:

循环链表:最后一个元素指向了第一个元素

2.栈和队列:

也是线性结构

⭕栈:先进后出

C#基类库中的栈:泛型的Stack类

重要方法:Push入栈,pop出栈,peek获取栈顶数据,clear清空,count获取栈中的数据的个数

csharp 复制代码
//3.使用BCL中Stack<T>  栈
Stack<char> stack = new Stack<char>();

stack.Push('a');
stack.Push('b');
stack.Push('c');
Console.WriteLine(stack.Count);

⭐如果自己去实现一个栈,如何去实现?

写一个新的接口:IStackDS(接口一般以I开头)【同时也使用泛型编程和接口】

csharp 复制代码
namespace List_T_Study
{
    //栈接口
    interface IStackDS<T>
    {
        int Count { get; }
        int GetLength();
        bool IsEmpty();
        void Clear();
        void Push(T item);
        T Pop();
        T Peek();
    }
}

分为顺序栈和链栈,顺序栈定义数组存放,链栈以链表的形式,新建一个SeqStack类,继承接口IStackDS并实现接口函数。

列举一部分函数:

csharp 复制代码
namespace List_T_Study
{
    class SeqStack<T> : IStackDS<T>
    {
        private T[] data;//数据
        private int top;    //栈顶的标志

        public SeqStack(int size)
        {
            data = new T[size];
            top = -1;
        }

        public SeqStack():this(10) 
        {
            //无参构造 则默认传长度10
        }
        public int Count {
            get
            {
                return top+1;
            }
        }

        public T Pop()
        {
            T temp = data[top];
            top--;
            return temp;
        }

        public void Push(T item)
        {
            data[top+1] = item;
            top++;
        }
    }
}

链栈,需要知道

⭕队列:先进先出

插入限定在表的尾部,

C#(CLR中的队列):泛型Queue类,

常用方法:Enqueue入队(放在队尾),Dequeue出队(移除队首元素),Peek,clear,count

csharp 复制代码
//4.队列
Queue<int> queue = new Queue<int>();  
queue.Enqueue(1);
queue.Enqueue(2);
queue.Enqueue(3);
queue.Dequeue();
Console.WriteLine(queue.Count);

栈和队列应用举例:回文判断

3.串和数组

实现字符串类的存储,构造和比较

4.排序

介绍,直接插入排序,简单选择排序,快速排序思想,

相关推荐
柒十三.5 分钟前
江科大51单片机笔记【17】红外遥控&电机调速
笔记·嵌入式硬件·51单片机
迷茫、Peanut29 分钟前
嵌入式学习L6网络编程D3TCP
服务器·网络·嵌入式硬件·学习·tcp/ip
Victoria Zhu1 小时前
零基础小白如何系统学习Spring Boot
spring boot·后端·学习
ThisIsClark2 小时前
【gopher的java学习笔记】如何知道一个jar包对应的maven中的groupId和atrifactId
java·笔记·学习
MrZWCui2 小时前
iOS OC使用正则表达式去除特殊符号并加粗文本,适用于接入AI大模型的流模式数据的文字处理
学习·ios·正则表达式·objective-c·xcode
程序猿人大林3 小时前
WPF 元素周期表
ui·c#·wpf
viperrrrrrrrrr73 小时前
大数据学习(67)- Flume、Sqoop、Kafka、DataX对比
大数据·学习·kafka·sqoop·flume·datax
吱吱喔喔4 小时前
NET Core中负责依赖注入和控制反转的核心组件有两个:IServiceCollection和IServiceProvider
经验分享·后端·中间件·架构·c#·依赖倒置原则
初九之潜龙勿用4 小时前
技术与情感交织的一生 (一)
笔记