- 博客(31)
- 收藏
- 关注
原创 数据结构初阶:详解二叉树(三):链式二叉树
本文详细介绍了链式结构二叉树的实现方法,主要包括:1. 二叉树的链式结构定义与手动创建方法;2. 前序、中序、后序三种递归遍历的实现及递归过程分析;3. 二叉树基本操作的实现,包括:计算结点个数/叶子节点个数/第k层结点个数、求二叉树深度、查找指定值结点、销毁二叉树等;4. 层序遍历的实现及队列辅助结构的应用;5. 完全二叉树的判断方法。文章通过大量代码示例和递归过程演示,系统讲解了二叉树的各种操作实现原理,并提供了完整的实现代码。这些内容为学习二叉树这一重要数据结构提供了详实的实践指导。
2025-08-21 11:41:20
937
15
原创 数据结构初阶:排序算法(三)归并排序、计数排序
本文介绍了两种排序算法:归并排序和计数排序。归并排序采用分治法,通过递归分解序列并合并有序子序列实现排序,时间复杂度O(nlogn),空间复杂度O(n),是稳定的排序算法。计数排序基于哈希原理,通过统计元素出现次数实现排序,适用于数据范围集中的情况,时间复杂度O(N+range),空间复杂度O(range),也是稳定的。文章最后对比了多种排序算法的复杂度和稳定性,强调稳定性指排序前后相同元素相对位置不变的性质。
2025-08-21 11:40:46
969
10
原创 数据结构初阶:详解二叉树(二):堆
堆是一种特殊的完全二叉树,分为大根堆和小根堆。堆的实现通常采用顺序结构的数组存储,通过向上调整和向下调整算法维护堆的性质。文章详细介绍了堆的初始化、入堆、出堆、取堆顶元素等基本操作,并提供了完整的C语言实现代码。重点讲解了堆排序的两种实现方式:使用向上调整建堆和向下调整建堆,分析比较了它们的时间复杂度。最后探讨了TOP-K问题的解决方案,提出利用堆结构高效处理大数据量下的前K大/小元素查询问题,给出了具体实现代码。堆结构在排序和优先级队列等场景中具有重要应用价值。
2025-08-18 11:14:49
833
4
原创 【数据结构与算法】数据结构初阶:详解二叉树(一)
本文介绍了二叉树的基本概念和重要应用。首先阐述了二叉树的定义、特点及四种主要作用:高效查找、动态数据管理、有序序列生成和树状结构表示。然后详细讲解了树的相关术语、表示方法和实际应用场景。重点分析了两种特殊二叉树——满二叉树和完全二叉树的结构特点,并比较了顺序存储和链式存储两种存储方式的适用场景。最后指出二叉树在计算机科学中的广泛应用,包括数据库索引、文件系统、数据压缩等领域。文章强调二叉树学习虽然有一定难度,但掌握后将带来巨大收获。
2025-08-18 11:12:34
379
原创 数据结构初阶:排序算法(二)交换排序
本文介绍了两种交换排序算法:冒泡排序和快速排序。冒泡排序通过相邻元素比较交换实现排序,时间复杂度O(n²)。快速排序是更高效的算法,采用分治思想,介绍了三种实现方式:1)Hoare版本通过左右指针划分;2)挖坑法通过移动坑位完成分区;3)前后指针法利用双指针遍历。文章还分析了快速排序的递归和非递归实现,非递归版本使用栈结构存储区间信息。两种算法的时间复杂度分别为:冒泡排序O(n²),快速排序最优情况O(nlogn),最坏O(n²)。空间复杂度方面,冒泡为O(1),快速排序递归版为O(logn)。
2025-08-15 19:48:00
828
12
原创 数据结构初阶:排序算法(一)插入排序、选择排序
本文介绍了常见的排序算法及其实现。文章重点分析了插入排序(直接插入排序和希尔排序)和选择排序(直接选择排序和堆排序)两类算法,详细说明了其基本思想、代码实现和时间复杂度。插入排序通过将元素插入已排序序列实现,时间复杂度为O(n²);希尔排序作为改进版,采用分组插入策略,时间复杂度为O(n^1.3)。选择排序每次选取极值元素,时间复杂度为O(n²);堆排序利用堆结构优化选择过程,时间复杂度为O(nlogn)。文章通过代码示例和性能对比,展示了各算法的特点及适用场景。
2025-08-15 19:47:50
935
12
原创 飞算JavaAI:智能编程新时代
飞算JavaAI是一款智能全栈开发引擎,通过自然语言交互实现Java应用从需求分析到部署的全流程开发。其核心价值在于提供全栈智能开发能力,包括自动生成SpringCloud微服务、适配前端框架、优化数据库操作等。平台采用AI驱动的需求解析引擎和代码生成体系,支持200+种代码缺陷检测。用户可通过简单注册后,在"需求画布"中用自然语言描述需求,平台10秒内即可生成完整代码框架。实测显示,其Java代码生成质量和错误修复能力优于通用AI工具,特别适合快速开发企业级应用。
2025-08-13 16:35:10
1022
2
原创 类和对象(中):拷贝构造函数、赋值运算符重载、区分前置++和后置++运算符重载、综合练习--Date
摘要:本文详细讲解了C++中的拷贝构造函数和运算符重载。拷贝构造函数是一种特殊的构造函数,用于同类对象的初始化,其第一个参数必须是同类对象的引用,否则会导致无限递归。文章通过Date类示例展示了拷贝构造的实现,并比较了浅拷贝和深拷贝的区别。对于包含指针成员的类(如Stack),需要实现深拷贝以避免重复释放内存。运算符重载部分介绍了如何为自定义类型重载运算符,重点讲解了赋值运算符重载和前置/后置++运算符的区别。最后通过完整的Date类实现,演示了日期类的各种运算符重载方法,包括日期加减、比较运算等。
2025-08-07 20:47:24
774
6
原创 类和对象(中):类的默认成员函数、构造函数、析构函数
本文介绍了C++中类的默认成员函数,重点讲解了构造函数和析构函数。默认成员函数包括6个基础函数(C++11新增移动构造和移动赋值),其中构造函数负责对象初始化而非开辟空间,具有名称与类相同、无返回值、自动调用、可重载等特点。编译器会自动生成默认构造函数,但对内置类型初始化不确定,需自定义实现。析构函数在对象销毁时自动调用,用于资源清理,默认生成的析构函数对内置类型不做处理。文章通过代码示例展示了构造函数重载、默认构造函数的定义规则,并强调资源申请类必须自定义析构函数以避免内存泄漏。
2025-08-07 20:46:28
707
1
原创 C++入门基础(三):const引用、指针和引用的关系、inline(修饰内联函数)替代宏、nullptr代替null
本文探讨了C++中const引用、指针与引用的区别、内联函数和nullptr等关键概念。const引用的权限只能缩小不能放大,即不能通过非const引用修改const对象。指针和引用在语法概念、初始化要求、可变性等方面存在显著差异。内联函数(inline)作为宏的替代方案,能提高效率但可能被编译器忽略,建议直接在头文件中定义。C++11引入的nullptr解决了NULL可能导致的类型混淆问题,应优先使用nullptr表示空指针。这些特性展示了C++对类型安全和性能优化的重视。
2025-08-02 16:04:50
1035
2
原创 类和对象(上):类的定义、实例化、this指针、对比C++/C两种语言实现Stack
本文详细介绍了C++中类的定义与使用。主要内容包括:1)类的定义格式和成员变量/函数的访问控制(public/protected/private);2)struct在C++中也可以定义类;3)成员变量命名规范建议;4)类的作用域和::操作符的使用;5)类的实例化过程与对象内存分配;6)this指针的工作原理;7)通过对比C和C++实现栈的代码,展示C++面向对象封装特性的优势。文章从基础语法到实际应用,系统讲解了C++类的核心概念和使用方法。
2025-08-02 16:03:49
879
原创 C++入门基础(二):缺省参数、函数重载 、引用以及引用的使用相关知识
本文介绍了C++中的三个重要特性:缺省参数、函数重载和引用机制。1. 缺省参数分为全缺省和半缺省,半缺省必须从右向左连续定义,且只能在函数声明中指定缺省值;2. 函数重载允许同名函数通过参数个数、类型或顺序不同而区分,但不支持仅返回值不同的重载;3. 引用是变量的别名,不占用额外内存,常用于函数参数传递以替代指针,但链表等数据结构仍需使用指针。文章还通过实例分析了引用作为形参和返回值的正确使用方法,指出局部对象不宜作为引用返回,并揭示了引用在底层仍通过指针实现的本质。
2025-07-31 17:42:34
959
原创 C++入门基础(一):C++的发展历史、C++的第一个程序 、命名空间、C++输⼊&输出、命名空间的使用等内容介绍
本文介绍了C++的基础知识和发展历程。主要内容包括:1. C++的发展历史,从1979年Bjarne Stroustrup在贝尔实验室开发C++雏形,到1998年成为ANSI/ISO标准语言;2. C++第一个程序示例,对比C语言的hello world;3. 命名空间(namespace)的概念、定义和使用方法,解决命名冲突问题;4. C++的输入输出流(cin/cout)介绍;5. 三种使用命名空间的方式:指定命名空间访问、展开部分成员、展开全部成员。
2025-07-30 15:21:22
554
1
原创 顺序表(一):手撕动态顺序表
本文介绍了线性表和顺序表的基本概念与实现。顺序表作为线性表的一种,采用数组存储,具有增删改查功能,分为静态和动态两种实现方式。重点讲解了动态顺序表的纯C语言实现,包括初始化、扩容、插入(头插/尾插/指定位置)、删除(头删/尾删/指定位置)、查找、修改等核心操作。通过三个代码文件(头文件声明、具体实现、测试用例)完整展示了动态顺序表的结构与操作方法。文章以清晰的逻辑和代码示例,帮助读者理解顺序表的底层原理和实际应用。
2025-07-14 19:12:47
966
2
原创 预处理详解
本文介绍了C语言预处理指令的使用方法。主要内容包括:1. 预定义符号如__FILE__、__LINE__等的作用;2. #define定义常量和宏的语法,以及宏使用时的注意事项(如参数优先级、副作用);3. 宏与函数的优缺点对比;4. #和##运算符的特殊用法;5. 条件编译指令(#if、#ifdef等)的使用场景;6. 头文件包含的两种方式及避免重复包含的方法。文章通过具体代码示例详细说明了预处理阶段的各种技术要点,帮助读者掌握C语言预处理器的强大功能。
2025-07-08 15:00:31
696
原创 算法复杂度
本文介绍了数据结构与算法的基本概念及学习方法。数据结构指计算机存储和组织数据的方式,算法则是解决问题的计算步骤。学习建议包括:1)多写代码提升能力;2)结合画图辅助思考。重点讲解了算法效率的衡量标准——复杂度分析(时间复杂度和空间复杂度),通过实例详细说明大O渐进表示法的计算规则和应用场景。文章还以旋转数组问题为例,展示了不同解法在复杂度上的优化过程,从O(n²)逐步优化至O(n)时间+O(1)空间的最优解。最后强调复杂度分析在算法学习中的核心地位,为后续数据结构学习奠定基础。
2025-06-27 19:43:00
1113
原创 c语言内存函数
本文介绍了C语言中常用的内存操作函数及其模拟实现方法。首先讲解了memcpy函数的使用和模拟实现,强调其按字节拷贝的特性;然后对比memmove函数与memcpy的区别,重点说明memmove能处理内存重叠的情况并给出两种模拟实现方案;接着介绍memset的内存设置功能及其注意事项;最后说明memcmp的内存比较功能。每个函数都配有代码示例,清晰展示了它们在内存操作中的具体应用场景和实现原理,为理解底层内存操作提供了实用参考。
2025-06-03 23:58:41
1308
原创 字符函数和字符串函数
本文介绍了C语言中常用的字符串处理函数及其模拟实现方法。主要内容包括:1. 字符分类函数(islower等)和转换函数(tolower/toupper)的使用;2. 字符串操作函数:strlen(求长度)、strcpy(拷贝)、strcat(拼接)、strcmp(比较)的用法及模拟实现;3. 带长度限制的字符串函数:strncpy、strncat、strncmp;4. 字符串查找函数strstr和分割函数strtok;5. 错误处理函数strerror和perror。
2025-06-02 16:07:12
724
原创 文件操作管理
本文摘要: 本文全面介绍了C语言中文件操作的相关知识,主要包括以下内容: 文件的基本概念:区分程序文件和数据文件,解释文件名组成结构,以及二进制文件和文本文件的区别。 文件操作流程: 使用FILE指针管理文件流 fopen()和fclose()函数进行文件的打开和关闭 标准输入/输出流(stdin/stdout)的概念 文件读写函数: 顺序读写:fputc/fgetc、fputs/fgets、fprintf/fscanf、fwrite/fread 随机读写:fseek、ftell、rewind 格式化转换:
2025-05-29 18:26:24
1423
原创 动态内存管理
本文系统介绍了C语言动态内存管理的核心内容,包括动态内存分配的必要性、常用函数及其使用规范。主要内容可归纳为: 动态内存分配的必要性:解决固定大小数组无法满足运行时不确定空间需求的问题,使程序更灵活。 关键函数详解: malloc:申请指定大小连续堆空间 free:释放动态分配的内存 calloc:申请并初始化空间为0 realloc:调整已分配内存大小 常见错误分析:包括NULL指针解引用、越界访问、错误释放等6类典型错误,强调内存泄漏风险。 使用规范: 必须检查分配是否成功 谁申请谁释放原则 free后
2025-05-24 15:48:31
1269
原创 数据在内存中的存储
本文详细探讨了整数和浮点数在内存中的存储方式。首先,整数在内存中以二进制的补码形式存储,无符号整数的原码、反码和补码相同。其次,介绍了大小端字节序的概念及其判断方法,大端字节序将高位字节存储在低地址,小端字节序则相反。接着,通过多个练习加深了对字节序和整数存储的理解。最后,讨论了浮点数在内存中的存储方式,根据IEEE 754标准,浮点数由符号位、指数和有效数字三部分组成,并详细解释了浮点数的存储和读取过程。通过代码示例,展示了浮点数存储的实际应用和可能出现的误差。
2025-05-23 16:43:55
994
原创 自定义类型:结构体、联合体、枚举
本文详细介绍了C语言中结构体、联合体和枚举类型的使用及其相关特性。结构体部分包括结构体的声明、变量创建与初始化、自引用、内存对齐规则及其原因,以及结构体传参和位段的实现。联合体部分探讨了联合体的声明、特点、大小计算及其应用场景,如判断大小端字节序。枚举类型部分则介绍了枚举的声明、优点及其在实际编程中的应用,如增加代码可读性和维护性。通过具体代码示例,展示了这些数据类型在实际编程中的灵活运用,帮助读者深入理解其原理和使用方法。
2025-05-22 19:42:04
1002
原创 深入理解指针(5)
本文对比了C语言中的sizeof和strlen操作符,并详细解析了数组和指针相关的笔试题。sizeof用于计算变量或类型占用的内存大小,而strlen则用于计算字符串的长度,直到遇到\0为止。文章通过多个代码示例展示了sizeof和strlen在不同情况下的使用和结果,特别强调了数组名在不同上下文中的含义及其与指针的关系。此外,文章还通过指针运算的笔试题,深入探讨了指针的加减操作及其在内存中的表现,帮助读者更好地理解C语言中数组和指针的底层机制。
2025-05-17 19:50:06
1211
原创 深入理解指针(4)
本文介绍了函数指针数组、转移表、回调函数以及qsort函数的使用和模拟实现。函数指针数组是存放函数指针的数组,通过数组下标可以调用相应的函数。转移表通过函数指针数组简化了代码中的重复操作。回调函数是通过函数指针调用的函数,常用于将函数作为参数传递。qsort函数可以排序任意类型的数据,本文展示了如何对整型和结构体类型进行排序,并模拟实现了qsort函数的功能。通过这些内容,读者可以更好地理解函数指针和排序算法的应用。
2025-05-15 15:24:29
809
原创 深入理解指针(3)
本文主要探讨了C语言中的指针相关概念,包括字符指针、数组指针、二维数组传参、函数指针以及typedef类型重命名。字符指针部分解释了如何通过指针操作字符串,并强调了常量字符串的特性。数组指针部分区分了指针数组和数组指针,并说明了如何初始化数组指针。二维数组传参部分揭示了二维数组名在函数参数中实际上是数组指针的本质。函数指针部分介绍了如何通过指针调用函数,并展示了函数指针的声明和使用。最后,typedef部分展示了如何通过typedef为数组指针和函数指针类型创建别名,以及一般的类型重命名方法。这些内容为深入
2025-05-11 17:41:04
826
原创 深入理解指针(2)
本文深入探讨了数组和指针的相关概念及其应用。首先,数组名通常表示数组首元素的地址,但在sizeof和&操作中例外。文章通过代码示例展示了如何使用指针访问数组,并解释了数组名与指针的等价性。接着,讨论了数组传参的本质,即传递的是数组首元素的地址。此外,文章还介绍了冒泡排序的实现,展示了如何通过指针操作进行排序。最后,文章引入了二级指针和指针数组的概念,说明了指针变量地址的存储方式以及指针数组的定义和使用。通过这些内容,读者可以更深入地理解数组和指针在C语言中的应用与区别。
2025-05-10 17:24:38
571
原创 详解操作符
a=a1^b(此时这个表达式中的b是上一个表达式(b=a1^b)结果的b),在第二个表达式被执行的时候,b的值已经被a的值所替代,最终实现两个整数的交换。在大多数的编译器里面都是算术右移,也就是右边抛弃,左边用符号位填补,在上图中,红色的0表示的是填补上的符号位,红色的1表示被抛弃的。八进制:0,1,2,3,4,5,6,7 十六进制:0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f。•赋值操作符: = 、+= 、 -= 、 *= 、 /= 、%= 、<<= 、>>= 、&= 、|= 、^=
2025-04-26 18:07:18
1153
原创 求喝汽水,1瓶汽水1元,num个空瓶可以换一瓶汽水,给money元,可以喝多少汽水
5个空瓶可以换2个汽水,剩余1个空瓶, 5%2=2 余1。20元买20瓶汽水,得到20个空瓶,钱花光了。换完之后剩3个空瓶,可以换1个汽水,剩余1个空瓶, (2+1)%2=1 余1。
2025-04-24 21:56:08
300
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人