自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(52)
  • 收藏
  • 关注

原创 C#数据结构与算法学习笔记 优先队列

class MaxPQ<E>:IQueue<E> where E:IComparable<E> { private MaxHeap<E> heap; public int Count { get { return heap.Count; } } public bool IsEmpty { get { return heap.IsEmpty; } } public MaxPQ(...

2021-06-07 15:29:44 167 1

原创 C#数据结构与算法学习笔记 堆排序

什么是优先队列和堆? class MaxHeap<E> where E : IComparable<E> { private E[] heap; private int N; public MaxHeap(int capacity) { heap = new E[capacity + 1]; N = 0; } pub

2021-06-06 10:43:57 140 1

原创 C#数据结构与算法学习笔记 快速排序

快速排序1.先从数列中取出一个数作为基准数。2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。3.再对左右区间重复第二步,直到各区间只有一个数。 class QuickSort1 { public static void Sort(int[] arr) { int n = arr.Length; Sort(arr, 0, n - 1); }

2021-06-01 19:20:36 127

原创 C#数据结构与算法学习笔记 归并排序

1.归并排序的归并过程2.归并排序及递归调用3.归并排序优化

2021-05-31 17:14:45 98

原创 C#数据结构与算法学习笔记 排序算法

1.冒泡排序比较相邻的元素。如果第一个比第二个大,就交换他们两个。对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。针对所有的元素重复以上的步骤,除了最后一个。持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。 class BubbleSort { public static void Sort(int[] arr) { int n = arr.Length

2021-05-27 19:39:22 144

原创 C#数据结构与算法学习笔记 基于哈希表实现集合、映射

基于哈希表实现集合 class HashST1Set<Key> : ISet<Key> { private HashST1<Key> hashST1; public int Count { get { return hashST1.Count; } } public bool IsEmpty { get { return hashST1.IsEmpty; } } public HashS

2021-05-27 10:53:00 168

原创 C#数据结构与算法学习笔记 哈希表

1.哈希函数的设计2.哈希冲突处理3.哈希表添加、删除、包含

2021-05-27 09:32:17 96

原创 C#数据结构与算法学习笔记 基于红黑树实现集合、映射

基于红黑树实现集合 class RBT1Set<E> : ISet<E> where E : IComparable<E> { private RBT1<E> rbt; public RBT1Set() { rbt = new RBT1<E>(); } public int Count { get { return rbt.C

2021-05-25 18:53:15 134

原创 C#数据结构与算法学习笔记 红黑树

1.什么是2-3数2.什么是红黑树3.左旋转4.颜色反转和右旋转5.添加、包含、最大高度

2021-05-25 18:05:11 166

原创 C#数据结构与算法学习笔记 基于二叉查找树实现集合、映射

1.基于二叉查找树实现集合 class BST1Set<E> : ISet<E> where E : IComparable<E> { private BST1<E> bst; public BST1Set() { bst = new BST1<E>(); } public int Count { get { return b

2021-05-24 17:45:04 185 2

原创 C#数据结构与算法学习笔记 删除树中元素,计算树的最大高度

1.删除最大和最小元素找到最小值、最大值: public E Min() { if (IsEmpty) throw new ArgumentException("空树!"); return Min(root).e; } //返回以node为根的二叉查找树的最小值所在的节点 private Node Min(Node node)

2021-05-23 19:28:34 178

原创 C#数据结构与算法学习笔记 前序、中序、后序、层序遍历

1.前序遍历 public void PreOrder() { PreOrder(root); } //前序遍历以node为根的二叉查找树 private void PreOrder(Node node) { if (node == null) return; Console.WriteLine(node

2021-05-23 16:57:59 322

原创 C#数据结构与算法学习笔记 递归

1.递归与栈 class Program { public static int Func(int n) { if (n == 1) return 1; else return n * Func(n - 1); } static void Main(string[] args) {

2021-05-23 10:03:45 125

原创 C#数据结构与算法学习笔记 基于有序数组实现集合、映射

基于有序数组实现集合 class SortedArray1Set<Key> : ISet<Key> where Key : IComparable<Key> { private SortedArray1<Key> s; public int Count { get { return s.Count; } } public bool IsEmpty { get { return s.IsEmp

2021-05-21 12:12:33 223

原创 C#数据结构与算法学习笔记 有序数组和二分查找

1.二分查找和顺序查找二分查找: class TestSearch { public static int BinarySearch(int[] arr, int target) { int l = 0; int r = arr.Length - 1; while (l <= r) { //int mid = (l +

2021-05-20 19:27:00 237

原创 C#数据结构与算法学习笔记 基于无序链表实现映射

接口: interface IDictionary<Key,Value> { int Count { get; } bool IsEmpty { get; } void Add(Key key, Value value); void Remove(Key key); bool ContainsKey(Key key); Value Get(Key key); ..

2021-05-19 15:57:59 126 1

原创 C#数据结构与算法学习笔记 基于无序链表实现集合

集合接口: //集合接口 interface ISet<E> { int Count { get; } bool IsEmpty { get; } void Add(E e); void Remove(E e); //查询集合是否包含某元素 bool Contains(E e); }实现链表的集合: class LinkedList1Set&lt..

2021-05-19 15:03:23 122

原创 C#数据结构与算法学习笔记 栈与队列

1. 数组栈创建接口: interface IStack<E> { int Count { get; } bool IsEmpty { get; } void Push(E e); //往栈中添加元素 E Pop(); //删除栈顶元素,并将栈顶元素返回 E Peek(); //查看栈顶元素 }实现接口:

2021-05-18 16:45:08 111

原创 C#数据结构与算法学习笔记 链表

1. 什么是链表 class LinkedList1<E> { private class Node { public E e; //实际存储的元素,E类型的泛型,支持任意类型的数组 public Node next; //记录当前节点的下一个节点 public Node(E e,Node next) //用构造函数对这个类进行初始化

2021-05-16 18:30:16 97

原创 C#数据结构与算法学习笔记 数组(下)

1.5 动态数组 //动态数组 private void ResetCapacity(int newCapacity) //传递一个临时容量 { int[] newData = new int[newCapacity]; for (int i = 0; i < N; i++) { newData[i] = data[i]; }

2021-05-14 21:39:34 75

原创 C#数据结构与算法学习笔记 数组(上)

1.1 什么是动态数组namespace DataStructure{ class Program { static void Main(string[] args) { int[] arr = new int[10]; for (int i = 0; i < 10; i++) //不具备自动扩容,改为15会报错 { arr[i] = i;

2021-05-14 17:05:15 79

原创 C#学习笔记 接口隔离

反射与依赖注入反射:以不变应万变(更松的耦合)反射与接口的结合反射与特性的结合依赖注入:此DI非彼DI,但没有彼DI就没有此DI……

2021-04-17 10:23:30 141

原创 C#学习笔记 接口,依赖反转,单元测试

接口与单元测试接口的产生:自底向上(重构),自顶向下(设计)C#中接口的实现(隐式,显式,多接口)语言对面向对象设计的内建支持:依赖反转,接口隔离,开/闭原则……对存储在整型数组ArrayList里的整数进行求和、求平均值。1.在不使用接口的情况下,需要写4个函数。因为C#语言是强类型语言,用来操作整型数组的函数,是不能操作ArrayList实例的。在没有使用接口/契约的情况下,是非常不方便的。 static void Main(string[] args) {

2021-04-14 18:31:40 203

原创 C#学习笔记 抽象类与开闭原则

什么是接口和抽象类接口和抽象类都是“软件工程产物”具体类→抽象类→接口:越来越抽象,内部实现的东西越来越少抽象类是未完全实现逻辑的类(可以有字段和非public成员,它们代表了“具体逻辑”)抽象类为复用而生:专门作为基类来使用,也具有解耦功能封装确定的,开放不确定的,推迟到合适的子类中去实现接口是完全未实现逻辑的“类”(“纯虚类”;只要函数成员;成员全部public)接口为解耦而生:“高内聚,低耦合”,方便单元测试接口是一个“协约”,早已为工业生产所熟知(有分工必有协作,有协作必有协约)

2021-04-08 18:20:08 134

原创 C#学习笔记 重写,多态

类的继承类成员的“横向扩展”(成员越来越多)类成员的“纵向扩展”(行为改变,版本增高)类成员的隐藏(不常用)重写与隐藏的发生条件:函数成员,可见,签名一致构成重写:在父类的成员标记上virtual,然后在子类的成员标记上override,这样就构成了子类的成员对父类的成员进行重写。如果不加virtual和override,则称为子类成员对父类成员的隐藏。 class Program { static void Main(string[] args)

2021-04-08 16:20:35 78

原创 C#学习笔记 类的继承,类成员的访问

类声明的全貌声明既定义(C#与Java)最简单的类声明类的访问控制类成员的访问控制类的继承派生类对基类的成员获得与访问在派生类中访问基类的成员构造器的不可继承

2021-04-05 20:11:49 302

原创 C#学习笔记 什么是类

什么是“类”是一种数据结构(data structure)类是一种抽象数据结构。类本身是一个抽象的结果;类也是抽象数据和行为的载体。是一种数据类型类是一种引用类型,具体到每一个类上,每一个类都是一个自定义的类型。代表现实世界中的“种类”类是一种数据结构,它可以包含数据成员(常量和字段)、函数成员(方法、属性、事件、索引器、运算符、实例构造函数、静态构造函数和析构函数)以及嵌套类型。类类型支持继承,继承是一种机制,它使派生类可以堆基类进行扩展和专用化。——《C#语言规范》构

2021-04-02 11:39:41 723

原创 C#学习笔记 事件(下)

事件的声明事件的声明完整声明事件是基于委托的(两层意思):第一层:事件需要委托类型来做一个约束,这个约束既规定了事件能发送什么样的消息给事件的响应者,也规定了事件响应者能收到什么样的消息。这就决定了事件响应者的事件处理器必须能够和这个约束匹配上,它才能够订阅这个事件。第二层:当事件的响应者向事件的拥有者提供了能够匹配这个事件的事件处理器之后,需要有个地方把这个事件处理器保存或记录下来。能够记录/引用方法的任务只有委托类型的实例才能做到,所以我们用到了委托。总结:事件这种成员无论从表层约束来

2021-03-31 16:26:36 61

原创 C#学习笔记 事件(上)

初步了解事件定义: 单词Event,译为“事件”《牛津词典》中的解释是“a thing that happens,especially something important”通顺的解释就是“能够发生的什么事情”角色: 使对象或类具备通知能力的成员(中译)事件(Event)是一种使对象或类能够提供通知的成员(原文)An event is a member that enables an object or class to provide notifications.“对象O拥有一个

2021-03-30 20:37:49 84

原创 C#学习笔记 委托

什么是委托委托(delegate)是函数指针的“升级版”实例:C/C++中的函数指针一切皆地址变量(数据)是以某个地址为起点的一段内存中所存储的值函数(算法)是以某个地址为起点的一段内存中所存储的一组机器语言指令直接调用与间接调用直接调用:通过函数名来调用函数,CPU通过函数名直接获得函数所在地址并开始执行→返回间接调用:通过函数指针来调用函数,CPU通过读取函数指针存储的值获得函数所在地址并开始执行→返回Java中没有与委托相对应的功能实体委托的简单使用Acti

2021-03-25 19:52:18 134

原创 C#学习笔记 数组、具名、可选参数,扩展方法(this参数)

数组参数必须是形参列表中的最后一个,由params修饰举例:String.Format方法和String.Split方法 static void Main(string[] args) { //int[] myIntArray = new int[] { 1, 2, 3 }; //int result = CalculateSum(myIntArray); int result = Calcula

2021-03-22 17:51:36 118

原创 C#学习笔记 输出参数

输出参数用 out 修饰符声明的形参是输出形参。类似于引用形参,输出形参不创建新的存储位置。相反,输出形参表示的存储位置恰是在该方法调用中作为实参给出的那个变量所表示的存储位置。当形参为输出形参时,方法调用中的相应实参必须由关键字 out 并后接一个与形参类型相同的 variable-reference组成。变量在可以作为输出形参传递之前不一定需要明确赋值,但是在将变量作为输出形参传递的调用之后,该变量被认为是明确赋值的。在方法内部,与局部变量相同,输出形参最初被认为是未赋值的,因而必须在使用它的值

2021-03-22 16:45:12 643

原创 C#学习笔记 引用参数

引用参数引用形参是用 ref 修饰符声明的形参。与值形参不同,引用形参并不创建新的存储位置。相反,引用形参表示的存储位置恰是在方法调用中作为实参给出的那个变量所表示的存储位置。当形参为引用形参时,方法调用中的对应实参必须由关键字 ref 并后接一个与形参类型相同的 variable-reference组成。变量在可以作为引用形参传递之前,必须先明确赋值。在方法内部,引用形参始终被认为是明确赋值的。声明为迭代器的方法不能有引用形参。值类型 class Program {

2021-03-22 15:36:34 775

原创 C#学习笔记 传值参数

传值参数声明时不带修饰符的形参是值形参。一个值形参对应于一个局部变量,只是它的初始值来自该方法调用所提供的相应实参。当形参是值形参时,方法调用中的对应实参必须是表达式,并且它的类型可以隐式转换为形参的类型。允许方法将新值赋给值参数。这样的赋值只影响由该值形参表示的局部存储位置,而不会影响在方法调用时由调用方给出的实参。值类型: class Program { static void Main(string[] args) {

2021-03-19 17:36:10 260

原创 C#学习笔记 常量

常量什么是常量常量(constant)是表示常量值(即,可以在编译时计算的值)的类成员常量隶属于类型而不是对象,即没有“实例对象”“实例常量”的角色由只读实例字段来担当注意区分成员常量与局部常量常量的声明各种“只读”的应用场景为了提高程序可读性和执行效率——常量为了防止对象的值被改变——只读字段向外暴露不允许修改的属性——只读属性(静态或非静态),功能与常量有一些重叠当希望成为常量的值其类型不能被常量声明接受时(类、自定义结构体)——静态只读字段 clas

2021-03-18 18:04:40 79

原创 C#学习笔记 索引器

索引器(概述)什么是索引器索引器(indexer)是这样一种成员:它使对象能够用与数组相同的方式(即使用下标)进行索引索引器的声明参见C#语言定义文档注意:没有静态索引器1.索引器通常用于集合类型(下例代码的非集合类型情况很少见);2.平时对于初学者很少有机会写索引器。 class Program { static void Main(string[] args) { Student stu = new S

2021-03-18 17:30:49 89

原创 C#学习笔记 属性

什么是属性属性(property)是一种用于访问对象或类型的特征的成员,特征反映了状态属性是字段的自然扩展从命名上看,field更偏向于实例对象在内存中的布局property更偏向于反映现实世界对象的特征对外:暴露数据,数据可以是存储在字段里的,也可以是动态计算出来的对内:保护字段不被非法制“污染”属性由Get/Set方法进化而来又一个“语法糖”——属性背后的秘密属性的声明完整声明——后台(back)成员变量与访问器(注意使用code snippet和refactor工具).

2021-03-18 16:52:43 529

原创 C#学习笔记 字段

什么是字段字段(field)是一种表示与对象或类型(类与结构体)关联的变量字段是类型的成员,旧称“成员变量”与对象关联的字段亦称“实例字段”与类型关联的字段称为“静态字段”,由static修饰字段的声明参见C#语言定义文档尽管字段声明带有分号,但它不是语句字段的名字一定是名词字段的初始值无显示初始化时,字段获得其类型的默认值,所以字段“永远都不会未被初始化”实例字段初始化的时机——对象创建时静态字段初始化的时机——类型被加载(load)时只读字段实例只读字段.

2021-03-16 11:31:14 790

原创 C#学习笔记 语句

声明语句声明局部变量或常量。声明语句可以出现在块中,但不允许它们作为嵌入语句使用。局部变量声明int x = 100;//声明变量的时候,追加了变量的初始化器。int x;x = 100;//声明的时候没有初始化,在后面对变量进行了赋值。数组初始化器 int[] myArray = { 1, 2, 3 }; Console.WriteLine(myArray[1]);局部常量声明 const int x = 100; //常量在声明的同时,必须跟上初始化

2021-03-15 18:46:43 446

原创 C#学习笔记 操作符(下)

各类操作符的示例类型转换隐式(implicit)类型转换不丢失精度的转换子类向父类的转换装箱显式(explicit)类型转换有可能丢失精度(甚至发生错误)的转换,即cast拆箱使用Convert类ToString方法与各数据类型的Parse/TryParse方法自定义类型转换操作符示例...

2021-03-11 19:30:46 109

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除