自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 USART串口通信详解:原理与代码!

USART(通用同步/异步收发器)是一种支持全双工通信的串行接口,通过发送/接收数据寄存器和移位寄存器实现数据传输。其结构包含波特率发生器、控制状态模块和GPIO接口,支持8/9位数据帧格式(含起始位、校验位和停止位)。关键特性包括异步/同步模式选择、灵活波特率设定(通过USART_BRR寄存器配置)以及硬件流控制。代码示例展示了STM32的USART初始化及数据发送功能,涵盖字节发送、数组传输、格式化输出(printf重定向)等操作。USART广泛应用于微控制器通信,需注意起始位检测采样和波特率同步以确保

2025-06-18 13:13:01 552

原创 STM32DMA直接存储器存取简介!

STM32的DMA(直接存储器访问)模块是一种高效数据传输方案,可实现外设与存储器或存储器间直接传输,无需CPU干预。该模块支持四种传输模式:内存间模式、外设到内存模式、内存到外设模式和外设间模式,适用于数据采集、音频处理等场景。初始化过程包括开启时钟、配置参数、选择通道和启动DMA。通过中断机制可实现传输完成通知,典型应用如ADC数据采集后通过串口发送。DMA显著提升系统性能,降低CPU负载,是嵌入式系统优化的关键模块。

2025-06-16 11:35:36 732

原创 leetcode题解538:把二叉搜索树转换为累加树

本文介绍了如何将二叉搜索树转换为累加树的方法。通过递归遍历树结构,从右子树开始处理,利用全局变量pre记录节点值之和,更新当前节点值为原值与pre之和。该方法保持二叉搜索树结构不变,满足每个节点值等于所有大于等于该值的节点值之和的要求。代码采用后序遍历方式,先处理右子树,再更新节点值,最后处理左子树。递归终止条件是遇到空节点时返回NULL。文中通过示例详细说明了递归执行过程,展示了如何将根节点为5、左子节点为3、右子节点为7的树转换为根节点12、左子树10、右子树7的累加树。

2025-06-13 18:26:41 828

原创 leetcode题解669:修剪BST,掌握正确的修剪方式最重要!!!

摘要:本文介绍了如何修剪二叉搜索树(BST),使其所有节点值在给定区间[low, high]内。修剪需保持BST性质,通过递归实现:若节点值大于high则修剪左子树,小于low则修剪右子树,符合区间则保留并递归修剪左右子树。给出了C++解决方案及详细递归过程分析,包括终止条件、回溯逻辑和执行示例。该算法时间复杂度为O(n),空间复杂度为O(h)(树高),能高效完成修剪操作。

2025-06-11 11:07:43 866

原创 leetcode题解450:删除BST中的结点!调整二叉树的结构最难!

本文详细解析了如何在二叉搜索树(BST)中删除一个指定值的节点,并保持树的性质不变。文章首先介绍了题目要求和输入输出格式,随后分析了递归函数deleteNode的逻辑,包括基本情况和递归逻辑。接着,文章阐述了解题要点,重点在于理解二叉搜索树的性质以及删除操作对树结构的影响。代码部分提供了完整的C++实现,并通过详细注释解释了每一步的操作。最后,文章深入探讨了递归和回溯的过程,包括递归的终止条件、回溯时的状态恢复以及递归调用的具体步骤,并通过示例展示了代码的执行过程。通过本文的分析和代码实现,读者可以清晰地理

2025-06-10 23:52:27 779

原创 STM32ADC模数转换器,让你的32可以测量电压!!!

摘要:STM32微控制器的ADC模数转换器模块采用逐次逼近技术,支持12位分辨率、多种转换模式和触发方式。文章详细介绍了ADC的7种工作模式(扫描/非扫描、连续/单次、外部触发、DMA等)及适用场景,并提供了初始化配置、数据读取的代码示例。通过电压测量的实例展示了ADC的实际应用方法,包括GPIO设置、参数配置、校准流程及电压计算公式(Voltage=ADValue/4095×3.3),最终实现OLED实时显示。该模块在传感器采集、音频处理等领域具有重要应用价值。

2025-06-09 10:45:54 774

原创 STM32编码器接口测速,小车类项目你一定用得上!!!

STM32微控制器的编码器接口技术解析 摘要:本文详细介绍了STM32微控制器中的编码器接口技术,主要包含以下内容:1) 编码器接口的基本原理,通过处理正交编码器的A/B两相信号实现位置、方向和速度检测;2) 核心功能包括四倍频技术、方向检测和输入滤波;3) 硬件结构组成,包括GPIO、滤波器和时基单元等模块;4) 具体应用场景如电机控制和机器人技术;5) 完整的初始化步骤和示例代码实现,展示了如何通过中断处理实现旋转方向判断和脉冲计数。该技术能显著提升旋转运动的测量精度和控制性能。

2025-06-07 13:38:58 721

原创 leetcode题解701:二叉搜索树中的插入操作(其实很简单!!!)

本文介绍了在二叉搜索树(BST)中插入新节点的递归实现方法。当插入新值时,需保持BST的性质:左子树节点值小于当前节点,右子树节点值大于当前节点。核心思路是:若当前节点为空则创建新节点;否则根据值大小递归插入左/右子树,并通过回溯更新子树链接。代码示例展示了该过程,包括终止条件(节点为空时创建)、递归调用(比较值大小选择方向)和回溯处理(更新子节点链接)。这种方法确保插入后仍保持BST特性,时间复杂度为O(h),h为树高。

2025-06-06 12:16:11 683

原创 leetcode题解235:二叉树的最近公共祖先

题目要求在二叉搜索树(BST)中找出两个指定节点p和q的最近公共祖先(LCA)。解题关键点在于利用BST的性质:对于任意节点,左子树的值都小于该节点,右子树的值都大于该节点。通过递归遍历,当当前节点值同时大于p和q时搜索左子树,同时小于时搜索右子树,否则当前节点即为LCA。该方法时间复杂度为O(h),h为树高,空间复杂度为O(h)递归栈空间。代码简洁高效,充分体现了BST的特性优势。

2025-06-05 11:51:50 809

原创 leetcode题解236:二叉树的最近公共祖先

本题要求找出二叉树中两个节点的最近公共祖先(LCA)。采用递归解法:若当前节点为空或等于p/q则直接返回;否则递归检查左右子树。当左右子树均返回非空时,当前节点即为LCA;若仅一侧非空,则返回该侧结果。时间复杂度O(n),空间复杂度O(h),其中h为树高。关键点在于通过后序遍历自底向上判断节点关系,利用递归天然的回溯特性定位LCA。

2025-06-04 16:07:29 431

原创 leetcode题解98:验证二叉搜索树。(中序遍历!!!BST要点!)

摘要:本文讲解了如何判断二叉树是否为有效的二叉搜索树(BST)。关键方法是利用中序遍历特性,即BST的中序遍历结果应为严格递增序列。通过递归实现:1)检查左子树是否为BST;2)比较当前节点与前驱节点值;3)检查右子树是否为BST。使用辅助变量pre记录前驱节点,若发现pre->val >= root->val即返回false。最终返回左右子树检查结果的逻辑与。该方法时间复杂度O(n),空间复杂度O(h),h为树高。

2025-06-03 16:46:01 575

原创 力扣题解654:最大二叉树

题目要求根据不重复整数数组构建最大二叉树,规则为:根节点为数组最大值,递归构建左子树(最大值左侧子数组)和右子树(右侧子数组)。算法通过递归实现,先处理空数组或单元素数组的边界情况,找到当前数组最大值及索引后创建根节点,再分别递归处理左右子数组。C++代码示例展示了完整的实现过程,包括数组分割和递归调用。以数组[3,2,1,6,0,5]为例,先确定根节点6,再递归处理左子树[3,2,1]和右子树[0,5],最终构建完整的最大二叉树结构。

2025-06-02 13:07:29 622

原创 力扣题解106:从中序与后序遍历序列构造二叉树

本文介绍如何根据二叉树的中序和后序遍历序列重建原二叉树。通过递归方法,利用后序序列的末位元素确定根节点,在中序序列中找到左右子树分界点。算法步骤包括:1)判断空树情况;2)提取根节点;3)划分左右子树;4)递归构建子树。C++实现中,traversal函数处理子树划分和递归构建,buildTree函数作为入口。时间复杂度为O(n),需遍历节点定位根位置。该方法有效解决了二叉树重建问题,关键点在于准确划分遍历序列的左右子树范围。

2025-06-01 10:53:06 1178

原创 leetcode题解513:找树左下角的值(递归中的回溯处理)!

题目要求找到二叉树最底层最左边节点的值。采用深度优先搜索(DFS)方法,通过递归遍历整棵树,记录当前深度和最大深度。当遇到叶子节点时,若当前深度大于最大深度,则更新结果值和最大深度。遍历时优先访问左子树,确保找到同一深度层的最左节点。在递归回溯时需手动调整深度参数。算法时间复杂度为O(n),空间复杂度为O(h),其中n为节点数,h为树高。该方法通过一次遍历即可准确锁定目标节点,兼顾效率与准确性。

2025-05-30 14:31:50 761

原创 让你的STM32变身简易示波器,学会输入捕获就可以!

本文介绍了STM32微控制器输入捕获(Input Capture)功能在PWM信号测量中的应用。通过配置定时器的输入捕获单元,可以精确测量外部信号的频率和占空比。文章详细讲解了测频法和测周法的原理,并提供了完整的代码实现方案,包括初始化定时器、GPIO配置、捕获模式设置等关键步骤。代码展示了如何在STM32F103平台上通过TIM3定时器捕获PWM信号参数,并将结果实时显示在OLED屏幕上。该方案适用于需要精确测量外部信号参数的嵌入式应用场景。

2025-05-29 11:41:27 266

原创 新手项目必备技能:PWM驱动电机、舵机、呼吸灯

PWM是一种通过改变脉冲信号的宽度来控制设备的技术。PWM信号由高电平和低电平组成,通过调整高电平的持续时间(脉冲宽度),可以实现对设备的精确控制。PWM信号的两个重要参数是占空比和频率占空比:高电平时间与整个周期时间的比值,通常用百分比表示。频率:PWM信号的周期性重复速率,单位是赫兹(Hz)。时基单元PSC(预分频器):用来降低计数器的计数速度。比如,如果输入时钟是1MHz,预分频器设置为1000,那么计数器的计数速度就变成了1kHz。

2025-05-28 16:35:27 945

原创 想要掌握STM32定时器中断?这一篇文章就够了

本文介绍了STM32外部定时器中断的基本原理与应用。定时器通过对时钟信号计数实现精准定时,支持多种工作模式如向上计数、PWM输出等。文章详细讲解了TIM2定时器的初始化代码配置,包括GPIO设置、时钟源选择、时基单元配置及NVIC中断优先级设置。通过实例代码展示了如何使用定时器中断实现计数值累加,并配合OLED显示实时计数状态。中断服务函数中实现计数值更新和标志位清除,主循环则持续显示当前计数值。该实例可作为STM32定时器中断应用的入门参考。

2025-05-27 16:22:27 853

原创 初学STM32外部中断?小白看这篇就够了!

摘要:嵌入式系统中,外部中断(EXTI)是中断机制的重要类型,由外部信号触发。STM32配置外部中断需执行5个步骤:1)GPIO引脚设为输入模式;2)EXTI控制器设置触发条件;3)SYSCFG/AFIO模块引脚映射;4)NVIC使能中断并设优先级;5)编写中断服务函数(ISR)。代码示例展示了TIM2定时器和GPIOA的配置过程,包括时钟使能、引脚模式设置、NVIC优先级分组等关键操作,实现外部中断触发定时器计数的功能。

2025-05-26 11:22:42 896

原创 leetcode题解:144+145 二叉树的前序、后序遍历(非递归!)

本文介绍了二叉树前序和后序遍历的非递归实现方法。前序遍历利用栈结构,先将根节点入栈,然后依次处理右、左子节点,确保"根-左-右"顺序。后序遍历采用"伪前序+反转"技巧,先按"根-右-左"顺序遍历,最后反转结果得到"左-右-根"的正确顺序。文中提供了详细的C语言实现代码,包括栈结构定义、基础操作函数以及两种遍历算法实现。算法时间复杂度为O(n),空间复杂度为O(h)。关键技巧包括:前序遍历要注意入栈顺序,后序遍历通过反转简化实现。

2025-05-25 13:33:58 308

原创 STL 标准模板库全面解析:容器、算法与迭代器的核心应用

STL(标准模板库)是C++的核心库,提供六大组件:容器(vector、list等)、算法(sort、find等)、迭代器、仿函数、适配器和空间配置器。容器分为序列式(如vector、deque)和关联式(如set、map),通过迭代器连接算法。STL支持泛型编程,提升代码复用性,但需注意迭代器失效问题(如vector扩容时)。性能优化技巧包括预留空间、选择合适容器等。STL广泛应用于数据结构与算法实现,是C++开发的重要工具。

2025-05-25 13:26:35 814

原创 STM32 的 GPIO 多种输入输出模式分不清?本文一站式搞懂!

STM32的GPIO(通用输入输出端口)是连接芯片与外部设备的核心接口,支持多种输入输出模式。输入模式包括浮空、上拉、下拉和模拟输入,分别适用于不同电平检测和模拟信号采集场景。输出模式包含推挽、开漏及复用模式,可用于驱动LED、I2C通信等应用。使用GPIO需先启用时钟,再配置模式(如推挽输出控制LED),最后通过置位/复位引脚控制设备。合理选择GPIO模式能提升系统稳定性和可靠性。

2025-05-25 13:09:15 955

原创 数据库中表的设计规范

数据库表结构主要由列、行、主键和外键构成,其中列存储单一数据项,行是唯一记录。主键分为业务主键和代理主键,用于唯一标识记录;外键则用于表间关联。关系范式(1NF-3NF)通过约束确保表结构设计合理:1NF要求字段不可再分;2NF要求非主键字段完全依赖主键;3NF消除非主键间的传递依赖。规范化设计能减少冗余、保证数据一致性、简化维护并提高查询效率,但在特定场景下可能采用反范式优化性能。

2025-05-24 19:33:30 399

原创 进阶!归并排序代码实现(C语言)

归并排序是一种采用分治策略的高效排序算法。其核心思想是将数组递归分解为最小单元后有序合并,C语言实现需注意分解、合并和递归调用三个关键环节。算法时间复杂度稳定为O(nlogn),但需要O(n)额外空间。具体步骤包括:分解数组至单个元素、合并两个有序子数组、递归完成整体排序。代码实现展示了分块归并的过程,通过交替使用辅助数组完成排序,最终确保结果存储在原始数组中。该算法性能优越,适合大规模数据排序。

2025-05-22 11:52:57 315

原创 校招面试必考!快速排序(C语言)

快速排序是一种高效的分治排序算法,通过选择基准值将数组划分为左右两部分并递归排序。C语言实现要点包括基准值选择(如三数取中法)、分区操作和递归处理。时间复杂度平均为O(nlogn),最坏情况O(n²)可通过优化避免。具体步骤为:1)选择基准值;2)分区操作交换元素;3)递归排序子数组。文末给出了完整的快速排序C语言实现代码。

2025-05-22 11:23:33 295

原创 几种排序方式的C语言实现(冒泡、选择、插入、希尔等)

定义两个指针, Left Right 左指针右移找到比基准大的数, 右指针左移找到比基准小的数,两个指针交换内容,假设未排序的第一个为最小值,然后遍历未排序的内容,找到真正的最小值,和未排序的第一个位置互换,相邻两个元素比较,若前面一个元素大,就交换位置,一轮进行n-1次比较,一共执行n-1轮。基准:第一个或者最后一个元素, 优化方案:第一个、最后一个,中间元素 ,三个数的中间值。- 其他排序:冒泡、选择、插入、快速、归并、希尔、堆……- OO(n*n):冒泡、选择、插入、希尔...然后十位、百位、、、

2025-05-16 19:19:06 230

原创 力扣题解:1、两数之和 (梦开始的地方)

力扣第一题:1、两数之和 (梦开始的地方)

2025-05-10 10:50:22 531

原创 C++ 核心知识全面解析:从基础语法到面向对象与 STL

这是因为成员函数的第一个参数是隐式的 this 指针,它指向调用该函数的对象(必须是类类型)。如果类的变量开辟在堆区,然后再用赋值操作,P1=P2则P2的变量和P1的变量指向同一块堆区内存,在析构时就会对同一区域释放两次,造成程序崩溃。,但前向声明只告诉编译器 GoodGay 是一个类,而不会提供其成员函数的声明。这段代码打印时,只有第一次可以正常打印,因为局部变量在释放时,编译器会保留一次,但是第二次就不再保留了。当其他类的对象作为本类成员,构造时,先构造本类的对象,再构造自身, 先构造A,再构造B。

2025-05-10 10:23:01 375

原创 力扣题解:2、两数相加

个人认为,该题目可以看作合并两个链表的变种题,本题与21题不同的是,再处理两个结点时,对比的不是两者的大小,而是两者和是否大于10,加法计算中大于10要进位,所以我们需要声明一个用来标记是否进位的值。3、每次相加后,可能会有进位(即和大于等于10),需要将进位加到下一位的计算中。5、如果遍历完所有节点后仍有进位,需要额外创建一个节点来存储这个进位。2、同时遍历两个链表,将对应位置的数字相加,并考虑前一位的进位。4、如果两个链表长度不同,较短的链表在后续遍历中可以视为。

2025-05-10 10:19:55 376

原创 力扣题解:21.合并两个有序链表(C语言)

将两个升序链表合并为一个新的升序链表是一个经典的链表操作问题。可以通过递归或迭代的方法来解决。

2025-05-09 20:42:43 407

原创 C++演讲比赛案例代码

speechmanager.h : 存放功能函数的声明,以及speaker的容器。该案例是黑马的案例,不方便下载源代码的可以看一下。speaker.h :里面存放speeker类。speechmanager.c :功能函数的实现。main.c :与用户交互 ,显示菜单等。该案例有两个头文件,两个源文件。第一轮演讲12人,用v1存储。胜出的3人,用win存储。第二轮6人,用v2存储。

2025-05-05 11:10:39 366

原创 哈希表的线性探测C语言实现

哈希表(Hash Table)是一种基于哈希函数实现的高效数据结构,用于存储键值对(Key-Value)。它通过哈希函数将键(Key)映射到一个较小范围的整数值(通常是数组的索引),从而快速定位存储位置。哈希表的核心在于通过哈希函数实现快速的插入、查找和删除操作,其平均时间复杂度接近。

2025-04-26 14:37:00 707

原创 C语言数据结构:树的实现、前序、中序、后序遍历

树是一种非线性的数据结构,由若干个节点组成。每个节点都包含数据,并且可以有多个子节点。树的最顶端是一个特殊的节点,叫根节点,它没有父节点。从根节点开始,树不断向下分叉,形成不同的层次。最底层的节点叫叶子节点,它们没有子节点。

2025-04-12 18:50:48 477

原创 力扣题解:142. 环形链表 II

循环链表是一种特殊类型的链表,其尾节点的指针指向头节点,形成一个闭环。4).快指针在一圈内追上慢指针:如果慢指针走一圈,快指针则走了两圈,在这两圈内,快指针一定会与慢指针相遇,所以快指针在一圈内追上慢指针。2).如果有环,则快指针先进入环,慢指针后进入环, 如果无环,则fast会走出循环判断条件,返回空。3).有环时,慢指针进入环后,快指针相对慢指针每次移动一格,也就是快指针会追上慢指针。1).我们声明两个指针,快指针每次向链表下方走两步,慢指针则走一步;入口距离=(n-1)圈长+相遇点到入口的距离。

2025-04-09 21:41:33 387

原创 C语言数据结构:队列的操作实现

队列是一种常见的数据结构,遵循先进先出(FIFO)原则,即最先进入的元素最先被移除。它类似于现实生活中的排队,先到的人先接受服务。

2025-03-28 20:55:33 291

原创 C语言数据结构:栈的操作实现

2、进制转换(直接取余得到的顺序和结果相反,通过栈来调转)本文使用顺序栈,实现二进制转换。1、中缀表达式转后缀表达式。栈(Stack)是一种遵循。3、款项金额转中文大写。4、编辑器中括号的匹配。

2025-03-21 20:34:51 240

原创 C语言数据结构:双向链表的操作实现

双向链表(Doubly Linked List)是一种常见的线性数据结构。与单链表不同,双向链表的每个节点不仅包含指向下一个节点的指针(对双向链表的操作有:头插法,尾插法,清空链表,遍历链表,得到尾结点,特定位置插入,特定位置删除。这种结构使得双向链表可以从两个方向遍历,操作更加灵活。:由于有前驱指针,可以更方便地操作节点的前驱和后继。接下来我们通过代码来看对双向链表的操作。),还包含一个指向前一个节点的指针(:每个节点需要额外存储一个前驱指针。:可以从头到尾或从尾到头遍历链表。

2025-03-15 15:27:05 157

原创 C语言数据结构:链表的操作实现

2、寻找链表的中点(也可以找到其他比例的点去分割链表):快指针一次向尾部走两步,慢指针走一步,直到指向NULL,这时慢指针就会指向中间结点(偶数链表会指向中间的上一个,奇数会指向中间值)。本文包括链表的基本操作:初始化、头插法、尾插法、遍历打印、获取尾结点地址、指定位置添加和删除结点、获取链表长度、得到尾指针、释放链表、获得倒数第K个结点的值(快慢指针法)、翻转链表。1.找到倒数第K个值:快指针先走K步,循环向链表尾部走,直到指向NULL,这时慢指针就会指向想要的结点。

2025-03-09 17:02:50 390

原创 数据结构笔记

O(1)<O(log2n)(以2为底)<O(n)<O(nlog2n)<O(n²)<O(n³)<O(2^n)<O(n!数据:所有能够输入到计算机中,且能被计算机处理的符号的集合。- 链式存储 (每个节点、数据元素 附加额外的指针字段,通过指针建立逻辑关系)数据(集合)中的一个个体,是数据的基本单位,包含多个数据项。数据元素在存储器(内存、磁盘)中的存储结构 ,面向开发者。T(n) = O(f(n)),使用 O() 表示,<A,B> A是B的前驱,B是A的后驱。数据对象:由属性相同的数据元素构成的集合。

2025-03-09 16:22:57 245

原创 c语言数据结构:顺序表增删改查函数的实现

1、下列代码中 我用Eelemtype 来对int 取别名,在本段代码中意义不明显,但是在大量数据中如果要改int 型为 double型,则取别名的有点就显现出来了。其中共包含:1、初始化 2、最后一位插入 3、遍历 4、特定位置插入数据元素 5、特定位置删除数据元素 6、查找数据元素e第一次出现的位置。在数据结构中,我们最先接触到的内容就是线性表,本片文章的内容就是线性表中对顺序表增删改查的c语言实现。5、要注意顺序表的位置和在数组中序号的关系,length-1。4、对结构体取别名 Sq。

2025-03-06 18:04:34 309

原创 C语言学习笔记:初阶指针

在上述结果中我们可以看到,指针是有自己的地址的,当我们把指针指向a数组后,打印指针内的内容就变成了数组的首地址,我们通过 * 解引用,可以取出数组首地址中所存储的内容。我们需要对 * 解引用符号和& 取地址符号保持敏感,当指针名前有解引用符号,则表示的是指针里内容的地址,,当指针名前有&取地址时,则表示指针本身的地址。与系统有关 32位 4字节 64位 8字节,指针使用前需要赋值 , 否则就是空指针。在以后对指针的运用中,我们很容易搞混指针地址,指针中的地址,指针中的地址里的内容。

2025-03-06 17:45:09 166

空空如也

空空如也

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

TA关注的人

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