自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 从Intel开发手册看x86指令格式(含手动将指令转化为机器码的方法)

本文介绍了x86汇编指令翻译为机器码的方法,重点讲解了操作码、ModR/M字段、SIB字段的查找和使用。通过7个具体例题,详细演示了mov和add等指令的机器码转换过程,包括寄存器编号查找、寻址方式确定、偏移量和立即数处理等关键步骤。文章还提供了Intel开发手册和在线反汇编工具作为参考,帮助读者理解x86指令编码格式,并验证翻译结果的正确性。

2025-03-24 09:50:52 1351

原创 【x86汇编】C语言的switch&case结构的反汇编分析

push ebppush ebxpush esipush edipush ebp指令未执行时,打开寄存器窗口发现ESP=0x0012FFC18,为画栈区图做准备EBP的值入栈后,再次查看寄存器窗口发现有两个寄存器的值发生变动:EIP和ESPEIP寄存器(Extend Instruction Pointer 扩展指令指针寄存器,其存储指令的地址。

2024-10-29 19:57:40 1772

原创 纪念人生提交的第一个即将并入Linux内核的补丁

作者分享了提交首个Linux内核补丁的喜悦经历。虽然补丁技术含量不高,但标志着正式参与开源社区开发。文章附上了补丁提交链接和社区讨论记录

2025-12-19 22:40:04 284

原创 OS39.5.【Linux】分析ar命令生成的归档文件的格式

分析Linux/Unix中ar命令生成的归档文件格式。通过十六进制编辑器解析test.a归档文件,发现其包含文件头魔数"!<arch>\n"和60字节的元数据结构体ar_hdr。该结构体存储了文件名、时间戳、权限、大小等元数据,并以`\n结尾。文件内容保持原样未压缩,按偶字节对齐。文章详细解析了各字段含义,包括16字节文件名(以/结尾)、12字节时间戳、6字节UID/GID、8字节权限、10字节文件大小(ASCII形式)等元数据,展示了归档文件的具体存储结构。

2025-12-18 08:00:00 1016

原创 CE16.【C++ Cont】练习题组16(堆专题)

设用sum来存储总和,如果堆顶为奇,正常将堆顶元素加到sum中,之后删除堆顶元素;如果堆顶为偶,看看k是否为正,k如果为正,先用tmp保存堆顶元素,再删除堆顶元素,将除以2后tmp的再入堆,k如果为负,正常将堆顶元素加到sum中,之后删除堆顶元素。录入所有数后,建小堆,由于堆顶是最小的元素,如果只从堆顶取出第k小的元素,那么需要删除堆顶元素(k-1)次,之后堆顶就是第k小,之前删除的元素保留在临时数组中,待打印第k小的元素后将删除过的元素再入堆。,发现超出了int的存储范围!文章中讲过建大堆的算法。

2025-12-12 08:00:00 998

原创 OS44.【Linux】进程间通信 管道通信代码部分(1)

本文介绍了Linux系统中匿名管道通信的实现方法。通过pipe系统调用创建管道文件,使用fork创建子进程实现父子进程通信。父进程负责读取管道数据,子进程负责写入数据。文章详细讲解了write_pipe和read_pipe函数的实现,包括字符串处理、管道读写操作以及进程同步机制。特别强调了管道通信中父子进程的协同工作关系,以及数据传输过程中用户空间与内核空间的交互流程。最后通过完整代码演示了管道通信的实际应用,展示了父子进程间数据传输的动态过程。

2025-12-09 08:00:00 929

原创 OS43.【Linux】进程间通信 管道通信理论部分

本文摘要:进程间通信(IPC)是不同进程间数据交互的方式,本质是让进程共享同一份资源。操作系统作为第三方提供和管理这些资源,通过系统调用实现资源创建、使用和释放。重点讲解了匿名管道的实现原理:父子进程通过继承文件描述符共享内存级管道文件,实现单向通信。管道通信要求进程间必须存在血缘关系,且建议严格遵循单向通信原则(关闭不使用的端口)。文章还解释了tty的含义,并指出双向通信需使用两个管道。

2025-12-01 08:00:00 652

原创 OS42.【Linux】动态库文件的位置无关、深入分析PLT和GOT

深入探讨动态库和静态库的工作原理。主要内容包括:1) 动态库使用位置无关代码(PIC)技术,通过-fPIC选项编译,使库函数能加载到任意虚拟内存地址;2) 分析ASLR机制使动态库每次加载地址随机化;3) 详细解析PLT(过程链接表)和GOT(全局偏移表)的协作机制,PLT实现延迟绑定,GOT存储动态链接函数地址;4) 通过Cutter和GDB工具验证加载器通过DynamicLoaderOperation修改GOT表数据的过程。文章揭示了动态库加载的核心原理:使用相对地址偏移,通过基地址+偏移量的方式

2025-11-28 08:37:56 862 2

原创 OS41.【Linux】程序的入口地址、可执行文件的位置无关的解释

文章摘要:本文首先回顾了虚拟地址与物理地址的区别,解释了程序编译后内部地址的概念。通过分析可执行文件的ELF文件结构,说明了如何通过readelf命令查看程序入口地址。重点比较了位置无关(PIE)和位置相关(no_pie)可执行文件的区别:PIE类型(DYN)在运行时加载到随机虚拟地址(基址+偏移),而传统EXEC类型(no_pie)加载到固定地址。通过gdb调试验证了两种类型在内存中的地址映射差异,为理解程序加载执行机制提供了实践参考。

2025-11-26 08:23:17 666

原创 OS40.【Linux】动态库和静态库 自制动态库

文章摘要:文章探讨了C语言静态库和动态库的实现与使用问题。在静态库部分,通过除法函数示例展示了错误处理机制(如除零错误)的实现方式,并分析了Linux默认从右向左传参带来的问题及解决方法。动态库部分详细讲解了制作过程、权限要求、加载机制和共享特性,介绍了四种让操作系统找到自制动态库的方法:环境变量设置、启动脚本修改、系统目录拷贝和ldconfig配置。文章还涉及汇编代码分析、Pascal调用约定对比等底层细节,为开发者提供了全面的库文件开发实践指导。

2025-11-19 08:33:05 731

原创 OS39.【Linux】动态库和静态库 自制静态库

介绍Linux下静态库的制作和使用方法。主要内容包括:1)回顾静态链接原理,对比动态链接;2)演示如何创建静态库文件(.a文件)并通过Makefile自动化构建;3)详细讲解发布静态库的正确方式,包括头文件和库文件的组织;4)重点说明使用静态库时的三个关键参数:-I指定头文件路径、-L指定库路径、-l指定库名;5)补充gcc的默认搜索路径机制。文章通过多个代码版本逐步解决静态库使用中的常见问题,最终给出了完整的静态库编译命令示例。

2025-11-11 08:13:41 804

原创 CC56.【C++ Cont】差分算法

摘要:本文介绍了差分数组的概念及其在一维数组中的应用。差分是前缀和的逆运算,可将区间修改操作优化为O(1)时间复杂度。通过模板题展示了两种解法:暴力解法(O(n^2))和差分数组优化法(O(n))。重点讲解了差分数组的性质:区间[l,r]加k等价于差分数组d[l]+k和d[r+1]-k,最后通过前缀和还原原数组。给出两种实现方式(创建两个数组或仅用差分数组)并比较了优劣,指出差分适用于批量操作后统一查询的场景,但需注意long long防溢出和数据边界处理。

2025-11-07 08:00:00 655

原创 L60.【LeetCode题解】面试题 08.06. 汉诺塔问题

汉诺塔问题递归解法解析 本文详细分析了汉诺塔问题的递归解法。汉诺塔问题要求将N个盘子从起始柱A移动到目标柱C,遵循三个规则:每次移动一个盘子、只能移动最上面的盘子、小盘子不能放在大盘子下面。 关键点: 当n=1时,直接移动盘子 当n>1时,分解为三个步骤: 将n-1个盘子从A移动到B(C为辅助) 将第n个盘子从A移动到C 将n-1个盘子从B移动到C(A为辅助) 通过递归调用和归纳法,可以将问题不断分解为更小的子问题。文章提供了C++实现代码,适用于LeetCode平台,时间复杂度为O(2^n-1)。该

2025-11-04 08:07:28 711

原创 CC54.【C++ Cont】二维前缀和(模版题+矩阵区域和题)

本文介绍了两种处理二维矩阵区域和的方法:暴力解法和前缀和优化。暴力解法采用双重循环直接计算每次查询的区域和,时间复杂度较高易超时。前缀和方法通过预处理构建前缀和矩阵dp[i][j],利用状态转移方程dp[i][j] = arr[i][j] + dp[i-1][j] + dp[i][j-1] - dp[i-1][j-1],将每次查询的时间复杂度降至O(1)。文章还以LeetCode矩阵区域和问题为例,展示了如何利用前缀和处理边界条件,通过max/min函数管控有效区域范围,并给出了四种不同边界情况下的计算公式

2025-10-31 07:45:00 1970

原创 OS37.【Linux】EXT2文件系统实验1 格式化+超级块的重要性

本文通过两个实验探讨EXT2文件系统的关键特性。实验1详细演示了在Linux下格式化U盘为EXT2文件系统的过程,包括卸载挂载点、备份数据等操作,并分析了文件系统结构参数。实验2重点研究了超级块的重要性,通过人为破坏主超级块验证了备份超级块的恢复机制,介绍了使用e2fsck和dd命令从备份超级块恢复主超级块的方法。研究揭示了EXT2文件系统中超级块的关键作用和备份机制,为理解文件系统损坏与修复提供了实践参考。

2025-10-28 07:45:00 887

原创 OS37.【Linux】简单理解EXT2文件系统(2)

浅析了EXT2文件系统的核心机制。首先介绍了i_block数组的三级索引结构,推导出单个文件最大存储容量的计算方法;其次详细阐述了inode和block位图的管理机制,解释了删除文件时仅需修改位图而无需清空数据块的原理。文章还分析了文件系统"满"的三种情况,并重点讲解了超级块和组描述符的关键作用。在文件操作层面,系统性地揭示了新建、删除、查找和修改文件时内核的底层处理流程,特别强调了目录作为特殊文件的实现方式及其inode查找机制。最后,针对文件访问效率问题,介绍了EXT

2025-10-25 08:00:00 758

原创 CC55【C++ Cont】枚举算法之枚举对象的方法(NOIP2016 普及组 T2)

分析NOIP2016普及组T2题目,探讨了四种计算两个日期间回文日期的算法。方法1直接枚举所有数字效率最低;方法2枚举合法日期并判断回文,耗时1.05s;方法2.5优化日期拆分和回文判断,耗时95ms;方法4通过枚举月份和日期生成回文年份,仅需44ms且无需特别处理闰年情况。最终推荐方法4,其时间复杂度最优,代码简洁高效。

2025-10-23 08:00:00 686

原创 OS36.【Linux】简单理解EXT2文件系统(1)

Ext2文件系统采用分层结构管理磁盘数据,主要包括启动块、数据块、inode表等区域。数据块以4KB为单位存储文件内容,inode表则记录文件属性(不含文件名),每个inode有唯一编号。文件系统通过三级索引机制管理大文件:前12个直接索引指向数据块,第13个为二级索引(指向块号表),第14个为三级索引(多级间接寻址)。关键结构体ext2_inode包含文件权限、大小、时间戳等信息,其中i_block数组实现索引功能。inode数量在格式化时固定,无法动态调整。这种设计通过多级索引平衡了小文件存储效率和大文

2025-10-20 08:00:00 1794

原创 L59.【LeetCode题解】面试题 16.26. 计算器(方法1: 中缀转后缀+计算后缀表达式)

介绍如何计算逆波兰表达式(后缀表达式)和中缀表达式的方法。首先通过LCR036题解析了后缀表达式的计算过程:使用栈结构,遇到数字入栈,遇到运算符则取出栈顶两个元素计算后结果入栈。接着讲解了面试题16.26中将中缀表达式转换为后缀表达式的算法,包括处理运算符优先级的问题,通过建立运算符优先级映射来确保运算顺序正确。最后给出了完整的代码实现方案,包括字符串解析、中缀转后缀和最终计算的完整流程。

2025-10-17 08:00:00 1993

原创 CD81.【C++ Dev】判断二叉搜索树是否是红黑树

介绍如何通过前序遍历构建二叉搜索树,并验证其是否为红黑树的方法。首先通过LeetCode 1008题练习构建二叉搜索树,使用单调栈算法处理前序序列中的递增和递减关系。随后针对PAT 1135题,在构建二叉搜索树的基础上,重点实现红黑树的四个性质验证:根节点黑色、无连续红节点、所有路径黑节点数量相同等。文中详细分析了算法思路,包括递归验证黑节点数的实现,并提供了完整的C++代码实现和提交结果。该解决方案适用于处理输入的前序遍历序列,能够高效判断给定的二叉搜索树是否符合红黑树性质。

2025-10-15 07:45:00 1397

原创 CD80.【C++ Dev】模拟实现红黑树的插入

本文主要介绍了红黑树的插入操作实现。首先回顾了红黑树的性质,包括根节点和空节点为黑色、无连续红节点、每条路径黑节点数相同等。然后对比了AVL树和红黑树的特性差异,指出红黑树通过牺牲部分平衡性换取更好性能。重点讲解了插入节点的三种情况处理:1)当uncle节点为红色时进行变色处理;2)当uncle节点为黑色或不存在时进行旋转操作;3)详细分析了各种旋转情况下的抽象图例。最后给出了红黑树插入操作的代码实现框架,包括节点结构、插入函数和测试方法。文章强调红黑树通过颜色标记和旋转操作来维持平衡,相比AVL树具有更好

2025-10-11 08:00:00 678

原创 OS35.【Linux】文件系统前置知识

介绍磁盘存储和文件系统的基本原理。首先将文件分为打开和未打开两类,指出存储文件需要保存文件内容和属性。然后详细讲解了磁盘的物理结构,包括盘片、磁头等组件,并解释了磁盘利用磁性存储数据的原理。在抽象层面介绍了CHS/LBA两种寻址方式,说明扇区是磁盘访问的基本单位。最后初步探讨了文件系统的概念,指出操作系统通过分区管理硬盘空间,每个分区可以用结构体描述其地址范围,而文件系统的核心任务就是管理分区中的文件。文章还附有机械硬盘工作原理的视频链接作为补充学习资源。

2025-10-09 08:00:00 1001

原创 OS34.【Linux】文件IO (3) 缓冲区的补充和模拟实现fopen、fwrite、fclose函数

探讨C语言和操作系统缓冲区的区别与作用,解释了缓冲区存在的必要性(提高效率和格式化支持),分析了代码运行结果与缓冲策略的关系。通过模拟实现fopen、fwrite、fclose函数,详细讲解了如何为FILE结构体添加缓冲区,并比较了不同刷新策略的效率差异。实验证明,减少刷新次数(即减少系统调用)能显著提升效率,这解释了为什么缓冲区机制对程序性能至关重要。文章还包含缓冲区的三种刷新策略(立即刷新、行缓冲、全缓冲)的具体实现细节。

2025-09-29 08:00:00 676

原创 L58.【LeetCode题解】模拟算法习题集2(数青蛙)

提出两种方法计算字符串中模拟青蛙鸣叫所需最少青蛙数量。方法1使用青蛙数组记录每只青蛙的状态,通过遍历字符串匹配字符序列"croak",但时间复杂度较高。方法2优化为使用croak[5]数组统计各状态青蛙数量,通过检查前驱字符数量确保序列有效性,降低时间复杂度。两种方法均需处理无效字符串情况(如字符不匹配或序列不完整时返回-1),方法2通过位运算检查最终状态确保正确性。

2025-09-25 10:08:28 1093

原创 OS33.【Linux】文件IO (3) 缓冲区

本文探讨了C语言缓冲区的相关概念,通过对比不同示例代码的运行结果,分析了缓冲区在文件操作中的作用。文章指出C语言提供的缓冲区与操作系统内核缓冲区不同,并通过实验验证了close(1)会阻止缓冲区内容输出到屏幕。同时介绍了FILE结构体的组成,特别是其中的文件描述符字段。最后讨论了exit和_exit函数的区别,以及C语言缓冲区的三种刷新策略:行缓冲、全缓冲和无缓冲,并说明不同输出设备对应的刷新机制。文章为理解C语言文件操作和缓冲区机制提供了详细的技术分析。

2025-09-24 07:45:00 886

原创 CD78.【C++ Dev】以AVL项目的bug讲讲调试技巧

介绍AVL树实现中遇到的空指针访问错误及其调试过程。项目源代码包含AVLTree.h和main.cpp,在插入数据时出现RotateLight函数空指针异常。通过调用堆栈回溯、监视窗口查看变量和设计辅助函数is_balance()等方法定位问题。重点展示了如何使用条件断点、内联汇编和__debugbreak()进行调试,最终发现旋转操作后平衡因子未正确更新的问题。文中还提供了LeetCode平衡二叉树问题的解法,并给出了完整的调试代码和修复方案。

2025-09-23 07:45:00 1472

原创 【Linux】LRU缓存(C语言模拟实现)

介绍C语言实现LRU缓存算法的方法,重点讲解了如何结合uthash哈希表库来优化性能。主要内容包括:1) uthash哈希表的基本操作(创建、添加节点、查找、销毁);2) LRU缓存的实现思路,使用双向链表维护访问顺序;3) 详细代码实现,包括缓存初始化、get/put操作和内存释放;4) 提交结果展示。该实现通过哈希表快速查找,结合链表维护访问顺序,达到了O(1)时间复杂度的操作效率。

2025-09-22 08:00:00 672

原创 OS32.【Linux】文件IO (3) 重定向和理解“一切皆文件“

本文主要探讨Linux系统中的重定向机制及其底层实现原理。文章首先回顾了文件描述符和read系统调用的基本概念,详细解释了重定向的两种实现方法:通过close+open组合以及使用dup2系统调用。随后分析了输入/输出重定向在shell中的具体应用,包括如何为自制shell添加重定向功能。文章深入剖析了"Linux一切皆文件"的设计理念,通过虚拟文件系统(VFS)和文件操作结构体(file_operations)解释了不同设备的统一访问机制。最后,从面向对象的角度解读了Linux文件系统

2025-09-19 08:00:00 978

原创 【Linux】LRU缓存(C++模拟实现)

本文介绍了LRU缓存的设计与实现。LRU(最近最少使用)是一种常见的缓存淘汰算法,当缓存满时淘汰最近最少使用的数据。文章以LeetCode 146题为例,提出使用哈希表(unordered_map)存储键值对,双向链表(list)维护访问顺序的高效实现方案:链头存放最新访问数据,链尾存放LRU数据。通过哈希表存储链表迭代器,实现O(1)时间复杂度的查找和更新操作。具体实现包括:1)get操作需将被访问数据移至链头;2)put操作区分键存在(更新值)与不存在(插入新值,若缓存满需先删除链尾数据)两种情况。文章

2025-09-16 08:52:47 1040

原创 OS31.【Linux】文件IO (2) 文件描述符

介绍Linux文件IO中的文件描述符机制。首先回顾了文件描述符的基本概念,指出操作系统通过struct file结构体管理文件属性,并用链表组织打开的文件。重点分析了文件描述符的分配规则:默认从3开始编号,0-2被stdin、stdout、stderr占用;系统会寻找最小的未使用数组下标作为新文件描述符。通过实验验证了FILE结构体包含_fileno成员,与文件描述符关联。最后解释了文件引用计数机制,说明只有当引用计数归零时内核才会真正关闭文件。文章还提供了查看标准流文件描述符的两种方法,并建议进一步

2025-09-14 09:29:19 621

原创 OS29.【Linux】自制简单的Shell的修bug记录

分析了一个隐蔽的C程序bug,该bug导致环境变量environ[0]被意外修改。通过gdb调试发现,问题出在split_commandline函数中,由于main函数的argv数组和environ数组在内存中连续存放,当argv数组越界时修改了environ[0]的值。解决方法是避免使用main函数传递的argv数组,改为定义独立的argv数组空间。文章还验证了Linux进程内存布局中argv和environ数组的连续性,并参考了SystemV ABI规范说明这一特性。这个bug展示了内存越界的隐蔽性

2025-09-13 08:40:41 672

原创 OS28.【Linux】自制简单的Shell v.1.0版本

介绍自制Shell的实现过程,重点讲解命令行提示符的格式设计、命令字符串的读取与切割、常规命令和内置命令的执行机制。通过系统调用获取用户名、主机名和当前目录,巧妙处理路径显示;使用strtok函数切割命令参数;区分常规命令(fork+exec执行)和内置命令(直接执行)。文章还详细实现了cd、env、export、echo等内置命令,并提供了代码实现和运行测试示例。最后总结了Shell的基本工作原理和参考资料,为开发简易Shell提供了完整的技术方案。

2025-09-11 10:57:16 860

原创 CD77.【C++ Dev】AVL的模拟实现(2) 继续编写插入函数

本文系统讲解了AVL树的旋转操作实现,重点分析了右单旋和双旋的处理方法。主要内容包括:1)右单旋的四种情况分类及代码逐步改进过程;2)引入双旋的原因,详细阐述RL型情况的处理,包括先右旋再左旋的步骤、平衡因子更新的三种情况分类;3)LR型情况的分析及代码实现;4)提供测试代码验证实现正确性。文章采用从简单到复杂的分析方法,通过图示和代码示例,完整呈现了AVL树旋转操作的实现逻辑。

2025-09-09 08:15:00 602

原创 CD77.【C++ Dev】AVL的模拟实现(1) 以左单旋为切口,分析旋转规律

深入讲解了AVL树的模拟实现,重点分析了插入操作中的左单旋调整策略。文章首先回顾了AVL树的基本概念,介绍了三叉链节点结构设计,包含父节点指针和平衡因子。然后详细阐述了插入节点的过程,包括平衡因子更新规则和6种变化情况的示意图。核心部分重点剖析了当平衡因子从1变为2时所需的左单旋操作,从简单情况逐步推导出通用规律,并给出RotateLeft函数的具体实现代码,考虑各种边界情况。最后总结了平衡因子更新策略:当新增节点导致平衡因子变为0时停止更新;变为±1时继续向上调整;变为±2时进行旋转调整。文章还推荐了

2025-09-07 16:40:59 641

原创 OS30.【Linux】文件IO (1) open、write和close系统调用

介绍Linux系统下文件操作的相关知识,包括:1. 复习文件概念和分类,强调文件=内容+属性,以及打开文件与进程的关系。2. 对比C语言字符串和文件字符串的区别,指出文件字符串不需要以\0结尾。3. 讲解三个默认打开的文件流(stdin/stdout/stderr)及其使用。4. 详细说明open系统调用的使用方法,包括flags参数组合、mode参数权限设置等。5. 介绍write系统调用的使用注意事项,包括文件位置、截断和追加等写入方式。6. 最后分析C语言fopen函数与open系统调用的对比

2025-09-04 20:28:55 810

原创 CD76.【C++ Dev】异常

探讨C++异常处理机制及其优缺点。首先对比C语言的错误处理方式,指出其层层返回错误信息的繁琐性,进而介绍C++的异常处理机制,包括throw、catch的使用及异常匹配原则。通过实例演示了异常的抛出、捕获及栈展开过程,并介绍了服务器开发中常用的异常继承体系。还分析了C++标准库的异常体系,包括exception类及其派生类。最后总结了异常的优缺点:优点包括清晰展示错误信息、便于处理构造函数等无返回值情况;缺点涉及执行流跳转、内存泄漏风险、性能开销等,并提出了使用RAII、重新抛出异常

2025-09-03 09:17:35 762

原创 CD75.【C++ Dev】map和set练习题2(两个数组的交集、找出两数组的不同、前K个高频单词)

介绍三种解决数组和字符串相关问题的算法:1. 两个数组的交集:使用set去重排序后,通过双指针遍历查找交集元素。2. 两数组的差集:类似交集算法,修改判断条件找出各自独有的元素。3. 前K个高频单词:先用map统计词频,再通过vector排序处理,注意处理相同频率时的字典序要求,提供了stable_sort和修改比较函数两种解决方案。三种方法都充分利用了STL容器的特性,实现了高效的问题求解。

2025-09-01 08:50:25 1089

原创 CD74.【C++ Dev】map和set练习题1(有效的括号、复杂链表的复制)

有效的括号:原C语言实现手动处理栈操作,改用C++ STL的stack优化代码,并引入map存储括号匹配关系,简化判断逻辑。优化后代码更简洁,利用STL特性自动管理内存。 复杂链表的复制:原C语言实现采用三遍遍历方法,改用C++ STL的map建立原节点与复制节点的映射关系。通过一次遍历完成节点复制,再利用map快速设置random指针,避免了多次遍历,提高了代码可读性。 两题均展示了如何利用C++ STL容器简化数据结构和算法实现,使代码更简洁高效。

2025-08-31 15:35:11 327

原创 CD72【C++ Dev】二叉树的三种非递归遍历方式

总结了二叉树三种非递归遍历的实现方法:前序、中序和后序遍历。 前序遍历:通过栈保存左路节点,访问后处理右子树。访问顺序为根-左-右,代码使用双重循环实现。 中序遍历:类似前序,但访问节点时机改为从栈弹出时(左子树已处理完)。访问顺序为左-根-右。 后序遍历:需要区分首次/二次访问节点。提出三种方法: 利用内存填充字节标记访问状态(依赖64位架构) 使用prev变量记录前驱节点判断访问状态 使用辅助标记栈记录节点访问状态 三种遍历都通过栈管理节点访问顺序,时间复杂度O(n)。后序实现最复杂,需特殊处理节点

2025-08-29 20:46:34 724

原创 CD73.【C++ Dev】map和set

讲解C++中set和map的使用方法。对于set,介绍了其底层红黑树实现导致的深拷贝问题,以及三种删除节点方法的对比,推荐直接使用erase(val)方法。对于map,详细说明了pair的结构和四种插入方法,推荐使用make_pair或C++11的多参构造。重点分析了operator[]的实现原理,它通过insert实现插入和修改功能,可能导致意外插入默认构造值。文章通过代码示例和反汇编验证了这些特性,并指出使用operator[]时可能产生的不必要插入问题。

2025-08-26 13:11:21 596

C语言指针文章(H)的入口函数的测试程序

入口函数的测试程序

2025-04-24

【Cheat Engine】官方教程步骤8:多级指针详解文章的多级指针演示程序包

【Cheat Engine】官方教程步骤8:多级指针详解文章的多级指针演示程序包

2025-04-19

8086汇编用栈来分解并显示数字的bin文件

用栈来分解并显示数字文章的bin文件,可以写入vhd

2024-10-26

C语言模拟试卷1第一大题要点提示

C语言模拟试卷1题目+答案

2024-10-01

汇编实现从1加到1000的bin文件

这是汇编实现从1加到1000文章的配套资源,bin文件写入主引导扇区后可在VirtualBox上运行

2024-09-14

汇编语言在虚拟机中输出“Hello World!”的bin文件

bin文件

2024-09-05

VS 2022的float.h

float.h详细内容

2024-07-15

VS 2022的limits.h

limits.h详细内容

2024-07-15

空空如也

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

TA关注的人

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