自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 AVL 树深度解析与红黑树封装实践:从原理到实现

AVL 树和红黑树通过不同的平衡策略实现了自平衡二叉搜索树的高效性。AVL 树以严格平衡换取查询优势,红黑树以近似平衡减少旋转开销。基于红黑树封装的 set 和 map,充分利用了其有序性和动态操作高效性,成为实际开发中不可或缺的容器。理解两种树的实现原理和差异,有助于在实际场景中做出合理选择。

2025-08-03 17:09:23 817

原创 C++中的map 和 set 详解

C++ STL中的关联式容器(set/map)基于红黑树实现,提供高效的增删查操作(O(logN))。set用于存储唯一key,支持自动去重和有序遍历;map存储key-value对,通过[]运算符实现快速访问和修改。set/map的迭代器均为const,避免破坏结构。multiset/multimap允许key重复,但find/count/erase行为有所不同。典型应用场景包括数组去重、频率统计、查找重复节点等问题。这些容器在需要快速查找、自动排序和键值映射的场景中具有显著优势,是处理关联数据的强大工具

2025-07-29 15:32:39 738

原创 C++ 二叉搜索树:从原理到实战的全面指南

二叉搜索树是一种特殊的二叉树,就像一个 "有序的家谱":每个节点的左子树所有值都比它小,右子树所有值都比它大。比如一个存储数字的二叉搜索树:ss。

2025-06-18 21:45:15 757

原创 C++多态完全指南:从概念到底层实现

在虚函数的后后面写上=0,则这个函数为纯虚函数,纯虚函数不需要定义实现(实现没啥意义因为要被派生类重写,但是语法上可以实现),只要声明即可。包含纯虚函数的类叫做抽象类,抽象类不能实例化出对象,如果派生类继承后不重写纯虚函数,那么派生类也是抽象类。纯虚函数某种程度上强制了派生类重写虚函数,因为不重写实例化不出对象。语法形式virtual 返回值类型 函数名(参数列表) = 0;

2025-06-11 19:27:01 873

原创 C++继承机制深度解析:代码复用与层次化设计

class 派生类 : [继承方式] 基类 { ... };继承方式public(常用)、protectedprivate,默认(class关键字)为privatestruct默认public。术语映射基类(Base Class)= 父类(Parent Class)派生类(Derived Class)= 子类(Child Class)Student是Person的派生类,Person是Student的基类。class 派生类 : public 基类1, public 基类2 { ... };

2025-06-08 20:32:50 982

原创 C++ 栈(Stack)与队列(Queue)深度解析:从原理到实战

定义:将一个类的接口转换为另一种接口,使原本不兼容的类可以协同工作。STL 中的应用stack和queue本质是容器适配器,通过封装其他容器(如dequevector)的接口实现特定功能。数据结构访问规则底层容器(STL 默认)典型场景stack后进先出(LIFO)deque函数调用、表达式求值queue先进先出(FIFO)dequeBFS、任务队列优先级优先vector(堆结构)堆排序、最短路径算法。

2025-05-31 23:09:09 792

原创 C++ STL 容器:List 深度解析与实践指南

数据结构:双向循环链表(带哨兵位头结点),每个节点包含前驱指针、后继指针和数据域。核心优势高效插入 / 删除:任意位置操作时间复杂度为 O (1),无需移动元素。灵活迭代器:支持双向遍历(正向迭代器begin/end、反向迭代器局限性不支持随机访问(如operator[]),元素访问时间复杂度为 O (N)。内存碎片化问题:动态节点分配可能导致缓存利用率低。T val;

2025-05-27 20:30:11 1126

原创 C++ vector 深度解析:从原理到实战的全方位指南

int age;// 添加元素// 访问元素// 输出:// Bob 21随机访问高效:支持 O (1) 时间复杂度的下标访问。动态扩容:自动管理内存,避免手动分配 / 释放。丰富接口:提供push_backinserterase等便捷操作。

2025-05-23 23:03:24 1000 2

原创 深入探索 C++ 中的 string 类:从基础到实践

C++ 的string类功能强大,掌握其基本使用、常用接口、底层结构和模拟实现,能让开发者在处理字符串相关问题时更加得心应手。无论是在算法竞赛、日常开发还是面试中,对string类的深入理解都将成为你的有力武器。希望大家通过不断实践,熟练运用string类,编写出更高效、更健壮的代码。

2025-05-14 13:18:39 871

原创 深入解析 C++ 类与对象:从基础语法到高级特性的全面指南

类是用户自定义类型,通过class关键字定义,包含成员变量(属性)和成员函数public:// 公共接口:外部可直接调用// 初始化栈// 入栈int Top();// 获取栈顶元素// 销毁栈private:// 私有数据:仅类内可见int* array;// 存储数据的动态数组// 栈容量size_t top;// 栈顶下标(初始为0)访问限定符public:公开成员,类外可直接访问(如st.Push(5)private:私有成员,仅类内函数或友元可访问(外部访问会编译报错)

2025-05-02 20:57:15 844

原创 深入浅出 C++ 核心基础:从语法特性到入门体系构建

C++ 的魅力在于其 “零抽象层” 的控制力与 “泛型 + OOP” 的表现力。从基础语法到模板元编程,从内存管理到并发模型,每个知识点都需结合实践场景深入理解。建议学习者通过 “语法学习→项目实战→源码剖析” 的循环,逐步构建对 C++ 的系统性认知,最终实现从 “会用语法” 到 “精通设计” 的跨越。记住,C++ 的进阶之路没有捷径,但每一步都将夯实你对计算机科学的底层理解。

2025-04-20 23:20:35 2323

原创 数据结构排序算法全解析:从基础原理到实战应用

排序是将一组记录按照某个关键字的大小,按递增或递减顺序排列的过程。例如,将数组[5,3,9,6,2]排序为[2,3,5,6,9],本质上是通过关键字(这里是数值大小)重新组织数据的顺序。排序算法是数据结构的核心基础,每种算法都体现了不同的设计思想:插入排序的增量构建、快速排序的分治分区、计数排序的统计映射等。理解它们的核心逻辑、复杂度特性及适用场景,是在实际开发中做出正确选择的关键。从基础的O(n²)算法到高效的O(n log n)

2025-04-19 20:06:56 722

原创 二叉树深度解析:从基础概念到算法实现与应用

二叉树是一种严格有序的树结构空树:不含任何结点的集合,是二叉树的特殊形态。非空二叉树:由以下三部分组成:根结点(Root):唯一的顶层结点,没有父结点。左子树(Left Subtree):以根结点左子结点为根的二叉树。右子树(Right Subtree):以根结点右子结点为根的二叉树。关键特性度的限制:每个结点最多有2 个子结点(度为 0、1 或 2),不存在度大于 2 的结点。有序性:左右子树顺序严格区分,例如仅有左子结点的树与仅有右子结点的树视为不同结构。五种基本形态定义。

2025-04-12 18:01:37 907

原创 栈与队列:两种经典线性数据结构的深度解析

/ 动态数组存储数据int top;// 栈顶下标// 当前最大容量} Stack;return;// 内存分配失败处理// 队列节点// 队列整体结构// 队头指针(指向第一个节点)// 队尾指针(指向最后一个节点)int size;// 元素个数(优化:避免遍历计算长度)} Queue;栈和队列的核心价值在于通过限制操作接口,实现特定的访问顺序。栈的 LIFO 特性适合处理 “嵌套”“回溯” 场景(如函数调用、语法分析)

2025-04-12 16:49:30 1108

原创 深入解析链表:结构、实现与应用全指南

/ 单链表结点int data;// 数据域,存储具体数据// 指针域,指向下一个结点(NULL表示链尾)// 双向链表结点(增加前驱指针)int data;// 指向前驱结点// 指向后继结点链表的本质是通过指针实现动态逻辑结构,其设计体现了计算机科学中 “间接层” 的智慧 —— 用额外的指针域换取操作的灵活性。指针操作的精准控制:理解指针传递、解引用的底层机制边界条件的全面处理:空链表、头结点、尾结点的特殊情况数学建模能力:如环形链表的快慢指针证明、时间复杂度分析。

2025-04-12 11:42:06 980

原创 顺序表:从数组到高效数据管理的进化之路

定义顺序表是一种线性数据结构,其核心特点是物理存储连续。它通过一段地址连续的存储单元(通常为数组)依次存储数据元素,支持高效的随机访问和顺序操作。顺序表是线性表的一种实现方式,与链表不同,它在内存中以连续的块存储数据,类似于“紧密排列的火车车厢”类比理解数组是 “毛坯房”,仅提供原始存储功能(固定大小,操作需手动管理);顺序表是 “精装房”,在数组基础上增加了 “家具”(操作接口),让数据管理更便捷(提供自动化接口(如动态扩容),更适合实际应用场景)。// 数组 vs 顺序表。

2025-04-08 22:07:32 1002

原创 算法复杂度:从理论到实战的全面解析

实际中我们计算时间复杂度时,计算的也不是程序的精确的执行次数,精确执⾏次数计算起来还是很麻烦的(不同的⼀句程序代码,编译出的指令条数都是不⼀样的),计算出精确的执⾏次数意义也不⼤,因为我们计算时间复杂度只是想比较算法程序的增长量级,也就是当N不断变大时T(N)的差别,上面我们已经看到了当N不断变⼤时常数和低阶项对结果的影响很小,所以我们只需要计算程序能代表增长量级的大概执⾏次数,复杂度的表⽰通常使用大O的渐进表示法。在计算机科学中,算法的时间复杂度是⼀个函数式T(N),它定量描述了该算法的运⾏时间。

2025-04-03 22:58:17 847

原创 C 语言实现贪吃蛇小游戏:从设计到代码全解析

基础功能地图绘制:游戏界面包含墙体、蛇身和食物。墙体构成游戏的边界,蛇身由一系列节点组成,食物则随机出现在地图的空白位置。方向控制:玩家可以使用上下左右键来控制蛇的移动方向,改变蛇的前进路径。碰撞检测:当蛇撞到墙体或自身时,游戏结束。这需要我们在代码中实现相应的碰撞检测逻辑,确保游戏的合理性。得分系统:每当蛇吃到食物时,得分增加,同时蛇身增长一节,激励玩家不断挑战更高的分数。进阶功能加速 / 减速:玩家可以通过按下 F3 和 F4 键来调整蛇的移动速度,增加游戏的趣味性和挑战性。暂停功能。

2025-04-02 16:30:18 942

原创 深度揭秘 C 语言编译链接:从代码到可执行程序的全旅程

C 语言的编译链接过程是一个复杂而有序的系统工程,从源代码到可执行程序的每一步都蕴含着丰富的技术细节和原理。理解这个过程,不仅能够帮助我们更好地编写高质量的代码,还能在遇到问题时,快速准确地进行排查和调试。希望通过本文的介绍,能让大家对 C 语言编译链接有更深入的理解,在编程的道路上迈出更加坚实的步伐。

2025-02-17 19:05:41 679

原创 深入探索 C 语言文件操作:从基础到实践

当一个文件被使用时,系统会在内存中为其开辟一个相应的文件信息区,这个区域用于存放与该文件相关的各种信息,比如文件的名字、当前的文件状态(是打开状态还是关闭状态,是否处于读写操作中等等)以及文件当前的读写位置等。想象一下,我们编写了一个记录用户操作历史的程序,如果没有文件来保存这些数据,每次程序关闭后,用户的操作记录都将消失得无影无踪,下次启动程序时无法获取之前的信息,这显然无法满足实际需求。例如,一个图像文件如果以二进制形式存储,可以直接存储图像的像素信息,减少数据转换带来的开销,提高存储和读取的效率。

2025-02-16 22:31:37 648

原创 深入探索 C 语言中的自定义类型:结构体、联合体与枚举

结构体、联合体和枚举在 C 语言中各自扮演着重要角色。结构体擅长整合不同类型的数据,联合体能够有效节省内存,枚举则可以清晰地列举取值。而结构体实现的位段在特定场景下发挥着独特作用,尽管存在跨平台等问题,但合理使用能带来显著的性能提升。熟练掌握这些自定义类型及其特性,将使开发者在 C 语言编程的道路上如虎添翼,编写出更高效、更优质的代码。希望通过本文的介绍,大家能对它们有更深入的理解,并在实际编程中灵活运用。

2025-02-13 11:49:28 809

原创 深入解析:C语言中的整数与浮点数内存存储之谜

我们可以通过以下代码观察,数据在内存中的存储形式整数和浮点数在内存中的存储方式有着各自独特的规则和特点。整数采用补码形式存储,通过大小端字节序来安排多字节数据的存储顺序;而浮点数则遵循 IEEE 754 标准,通过符号位、有效数字和指数位来表示。理解这些存储机制对于我们深入掌握计算机原理、优化程序性能以及排查程序中的数据问题都有着重要的意义。希望通过这篇博客,能帮助大家更清晰地认识数据在内存中的存储方式。

2025-02-11 12:53:25 1028

原创 深入理解C语言核心函数:字符、字符串与内存函数全解析

C 语言的字符函数、字符串函数和内存函数为开发者提供了强大的工具集,在字符串处理、内存管理等方面发挥着重要作用。深入理解并熟练运用这些函数,能显著提升代码的质量与开发效率。希望通过本文的介绍,读者能对这些函数有更深入的认识,在 C 语言编程中更加得心应手。

2025-02-10 12:35:09 903

原创 深入理解C语言指针:从入门到实践

指针是存储内存地址的特殊变量,其核心价值在于:通过地址直接访问数据实现高效的内存管理构建复杂数据结构的基础。

2025-02-07 12:59:20 519

原创 C语言操作符详解:从入门到避坑指南

整型提升的意义: 表达式的整型运算要在CPU的相应运算器件内执⾏,CPU内整型运算器(ALU)的操作数的字节长度⼀ 般就是int的字节⻓度,同时也是CPU的通⽤寄存器的⻓度。即使有了操作符的优先级和结合性,我们写出的表达式依然有可能不能通过操作符的属性确定唯⼀的 计算路径,那这个表达式就是存在潜在⻛险的,建议不要写出特别复杂的表达式。位操作符用于对数据的位进行操作,包括按位与(&)、按位或(|)、按位异或(^)、按位取反(~)、左移(<<)和右移(>>)。包括逻辑与(&&)、逻辑或(||)和逻辑非(!

2025-02-06 12:55:26 477

原创 当函数学会“自我复制“:深入理解C语言递归的魔力

从这个公式不难看出:如何把⼀个较⼤的问题,转换为⼀个与原问题相似,但规模较小的问题来求解的。n的阶乘和n-1的阶乘是相似的问题,但是规模要少了n。有⼀种有特殊情况是:当 n==0 的时候,n的 阶乘是1,⽽其余n的阶乘都是可以通过上⾯的公式计算。如果有多个圆盘,函数就递归地移动上面的n-1个圆盘到辅助柱子,然后移动最大的圆盘到目标柱子,最后再递归地移动那n-1个圆盘到目标柱子。那我们就可以写出函数Fact求n的阶乘,假设Fact(n)就是求n的阶乘,那么Fact(n-1)就是求n-1的阶。

2025-02-05 11:10:21 480

原创 C语言数组的概念

我们称上图的初始化为不完全初始化,其中大括号中的数值代表数组中的元素,若大括号中的元素个数与方括号中的数字相等,则称为完全初始化。C语言规定数组是有下标的,下标是从0开始的,假设数组有n个元素,最后⼀个元素的下标是n-1,下 标就相当于数组元素的编号。素,这时候就是⼆维数组,⼆维数组作为数组元素的数组被称为三维数组,⼆维数组以上的数组统称 为多维数组。前⾯学习的数组被称为⼀维数组,数组的元素都是内置类型的,如果我们把⼀维数组做为数组的元。3.数组分为⼀维数组和多维数组,多维数组⼀般⽐较多⻅的是⼆维数组。

2025-02-04 11:18:57 440

原创 第一个小游戏————扫雷

因为,我们没有雷的地方设置的是0,有雷的地方设置的是1,因此我们判断雷的时候,可以将周围的八个坐标的数据相加,得出来的数据,就是雷的个数,因为最边缘的坐标,周围没有八个数据,因此我们可以将判断棋盘扩大,将其数据设置为0,就可以了,这样还与玩家输入的坐标相符合。对于判断的棋盘,我们可以将其设置为0和1,其中1代表是雷,如此我们在开始是可以将棋盘初始化为0,对于这个棋盘的大小,我们应设置为ROWS和COLS,至于为什么,请往下看。对于展示给玩家看的棋盘,我们可以设置横竖的坐标轴,剩余用*号来替代,代码如下。

2025-01-14 12:00:39 874

原创 C语言的分支与循环(二)

表达式 2 的结果如果等于0,则循环结束,表达式 2 的结果如果不等于0,则执⾏循环语句,循环语句执⾏完后,再去执行表达式3 ,调整循环变量,然后再去表达式 2的地⽅执⾏判断, 表达式 2 的结果,决定循环是否继 续。在 do while 循环中先执行语句,执⾏完语句,在去执⾏“判断表达式”,判断表达式的结果是不等于0,则继续循环,执⾏循环语句;在while循环中,要先判断表达式的真假,如果为真就执行循环体,每执行一次循环体,就判断一次表达式,看其是否为真,为真继续,为假结束循环,以此类推。

2024-10-25 23:37:06 526

原创 C语言分支和循环(一)

逻辑运算符有&&(且)和||(或),其中&&的语法形式为:exp1&&exp2,它的意思是如果exp1和exp2都正确,则表达式为真,如果有一个不正确,则表达式为假。||的语法形式为exp1||exp2,意思是两个表达式其中一个正确,表达式的值就为真。它也是按从左到右计算的,如果exp1为真就不计算第二个,如果为假,则计算第二个。它表示的意思是,如果表达式为真,则执行语句1,如果表达式的内容为假,则执行语句2。在C语言中0表示假,非0表示真,表达式的结果为非0,则语句执行,表达式的结果为0,则语句不执行。

2024-10-25 13:33:54 458

原创 C语言操作符与输入输出

它的第⼀个参数是⼀个格式字符串,⾥⾯会放置占位符(与 printf() 的占位符基本⼀致),告诉编译器如何解读⽤⼾的输⼊,需要提取的数据是什么类型。%d 表⽰⽤⼾输⼊的应该是⼀个整数。单目操作符有++,--,+(正),-(负)其中++,--有两种形式,例如++有前自增和后自增,其适用形式不同。占位符有很多,常用的有%c,%d,%s,%f,%p,%zd等。赋值操作符有=,+=,-=,*=等,其中“=”是将右侧的值赋给左侧,而+=,-=等的运算形式相同,例如:+=---->a+=3----->a=a+3。

2024-10-24 22:46:33 510

原创 C语言数据类型和变量

每⼀种数据类型有⾃⼰的取值范围,也就是存储的数值的最⼤值和最⼩值的区间,有了丰富的类 型,我们就可以在适当的场景下去选择适合的类型。如果要查看当前系统上不同数据类型的极限值: limits.h ⽂件中说明了整型类型的取值范围。对于数据长度,一般用sizeof(数据类型)来求其长度,其计算结果为size_t,其返回值的具体形式由系统去决定,通常的使用“printf(“%zd(zu)”,sizeof(数据类型))”去输出。内置数据类型大概分为四类,分别为:字符型,整型,浮点型和布尔型。

2024-10-24 22:05:57 351

空空如也

空空如也

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

TA关注的人

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