自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 STL中容器vector -- 讲解超详细

在上一节已经学习了string的接口和模拟实现,vector的接口和string大差不差,重点是vector的模拟实现和迭代器失效的问题!!!

2025-11-09 20:57:17 1025

原创 STL容器string的模拟实现

在上一节已经学习了string的一些常用的接口,那这些接口如何实现?那下面就来学习string接口的模拟实现过程!!!如果_str初始化为nullptr,那么程序会崩溃!!为什么会崩溃呢?这里同样的,在开辟空间的时候要预留一个空间给'\0'!!如果不给预留空间,而是用nullptr初始化,这里的strlen(s)就会对空指针解引用,导致程序崩溃!

2025-10-29 17:09:20 1123

原创 双指针系列3

【代码】双指针系列3。

2025-10-29 00:03:40 200 2

原创 双指针系列2

【代码】双指针系列2。

2025-10-28 23:55:55 165

原创 双指针系列1 - 283. 移动零 和 1089. 复写零

【代码】双指针系列1 - 283. 移动零 和 1089. 复写零。

2025-10-19 19:59:50 200

原创 STL中容器string -- 讲解超详细

在学习string之前,我们得先了解STL容器,什么是STL容器呢?STL(standard template libaray-标准模板库):是C++标准库的重要组成部分,不仅是一个可复用的。

2025-10-19 19:38:38 2381

原创 C++模板初阶 -- 讲解超详细

基于此函数距离编译还差一个实例化<T>,这个T只有.cpp知道,但是每个文件又是单向操作,我在编译的时候是不知道的,但是编译时头文件:就是告诉编译器,你不用管待会儿给你,你先运行,但是链接的时候我去找编译器要,欸没有,这不是欺诈吗?简单理解:就相当一个模具,我们需要什么类型的物品就使用什么模具,在程序中就是当我们要传不同的参数,编译器可以套模板自动完成加减。模板是泛型编程的基础。这里提一下:普通函数声明定义分离是可以的,但是模板函数和类是不支持分别定义在.h和.cpp文件的,会出现链接错误,至于为什么?

2025-10-10 16:47:08 963 2

原创 C++内存管理 -- 讲解超详细

在C语言中,我们已经初步学习过内存管理,即内存里面分为栈区,堆区,静态区和常量区。今天就来进一步学习。前情回顾:先来看一道题(1)栈又叫堆栈--非静态局部变量/函数参数/返回值等等,。(2)内存映射段是高效的I/O映射方式,用于装载一个共享的动态内存库。(3)堆用于程序运行时动态内存分配,堆是可以上增长的。(4)数据段(静态区)--存储全局数据和静态数据。(5)代码段(chang'liu'a)--可执行的代码/只读常量。

2025-09-29 19:32:37 1012

原创 类和对象(下)-- 讲解超详细

(虽然在主函数里面我们已经实例化一份d1,但是并没有对成员变量初始化,如果不写默认构造,成员变量可能会是随机值,当然不同的编译器结果不同)

2025-09-19 21:05:27 607

原创 用C++实现日期类

在上学的时候,总是在计算还有多少天放假;在上班的时候,总是在计算还有多久发工资?我们一般通过日历得到结果,那自己能不能实现一些基本的功能呢?答案是可以的!

2025-09-04 20:40:21 371

原创 C++类和对象(中)- 默认成员函数

无参构造函数,全缺省构造函数,不显示写编译器自动生成的构造函数都是默认构造。但是需要注意的是上面的三个默认构造不能同时出现,只能出现一个。比如无参构造函数和全缺省构造函数,在上一节说明了,同时存在编译器不知道调用谁。不显示和前两个不能同时存在应该能理解。

2025-09-02 21:07:14 916

原创 C++类和对象(上)

(1)class为定义类的关键字,date为类的名字,{}中为类的主体(注意类定义结束时后面分号不能省略)类体中内容称为类的成员:类中的变量称为类的属性或成员变量;类中的函数称为类的方法或者成员函数。//int day;//一般这样写int _year;int _month;int _day;

2025-08-24 16:32:22 933

原创 C++初识(下)中引用,内联和nullptr的概念(建议收藏)

在上一节我们已经接触了C++的一些基本语法,这一次我们介绍一些新内容。引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间, 它和它引用的变量共用同一块内存空间。比如:水壶传中李逵,宋江叫"铁牛",江湖上人称"黑旋风";林冲,外号豹子头;在之前我们学指针的时候对于&(取地址)操作符肯定不陌生,在这里我们又会使用。使用方法:类型& 引用别名=引用对象;这里通过地址我们可以发现,a和ra,b和rb的地址是一样的。画个图注意:引用类型和实体必须是同一类型!!!(1)引用在定义时必

2025-08-16 00:19:10 861

原创 C++入门(上) -- 讲解超详细

1.定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接⼀对{}即可,{}中即为命名空间的成员。命名空间中可以定义变量/函数/类型等。2.命名空间本质是定义出一个域,这个域跟全局域各自独立,不同的域可以定义同名变量,所以下面的rand不在冲突了。//命名空间的定义int main()//这里默认访问的是全局rand函数指针//这里访问的是命名空间域里面的randreturn 0;

2025-08-08 22:25:51 862

原创 初识排序(下)-- 讲解超详细

在上一节中介绍了排序的相关方法,接下来继续讲解快排和其他排序方法。上一节讲述了交换排序中的冒泡排序,现在来介绍交换排序的快排方法。

2025-08-08 15:18:12 867

原创 排序初识(上)-- 讲解超详细

发现没有,当我数组越接近有序的时候我直接插入效率就更高了!!!所以希尔排序再其基础上改进,它的效率肯定是要高于直接插入排序的!!

2025-07-24 15:53:02 1200 1

原创 牛客刷题 -- 二叉树遍历

这道题的大致意思是:用户自己输入字符串,我们根据输入的字符串按照遍历方式(前/中/后序遍历)创建一棵二叉树,和根据二叉树创建数组相反,是不是感觉挺有意思?1.创建二叉树结点,判断arr[i] == '#'?不成立,存储到二叉树,继续遍历。特别注意: 不要盲目的调用不返回创建的结点!2.中序遍历打印显示。

2025-07-23 14:37:30 432

原创 力扣刷题 -- 144.二叉树的前序遍历

1.我们既然要用数组去保存二叉树的内容,是不是得先有一个数组?所以需要动态开辟一块空间给数组。2.那么数组大小如何确定?我们是不是得遍历二叉树,根据得到得二叉树结点的个数创建数组!同理中序遍历和后续遍历也是一样的道理,只需要改变遍历方式即可。3.这里我们需要用前序遍历的方式遍历,即根左右。这里的前序遍历,题目给了我们一棵二叉树,我们的任务是用数组保存二叉树的内容!

2025-07-23 13:08:05 330

原创 力扣刷题 -- 572.另一颗树的子树

思路大概是这么个样子,那感觉和上次说的判断相同的树是不是类似?只不过这里我每一个分叉就要和subRoot进行比较!那就是说既然要找分叉,那岂不是我的每一棵子树都要和subRoot进行比较,看是否完全相同?分析题目可以知道,另一颗子树就是原树木的一支分叉,就是包含关系。情况2:有一颗树为空树,不满足要求。情况1:两棵树都为空树,满足要求。话不多说,我们画图分析!

2025-07-22 22:07:58 579

原创 力扣刷题 -- 101.对称二叉树

对称二叉树,说白了就是镜像对称,要解决这道题,我们需要分析镜像的特点。再进一步看,欸发现 2 结点的左孩子和右侧 2 结点的右孩子是相同的;结点的左孩子的值和结点右孩子的值一样,结点右孩子和结点左孩子一样。左侧 2 结点的右孩子和 右侧 2 结点的左孩子相同;就以示例1来说:根结点的左孩子和右孩子的值相同;这里我们要注意传参,如果只有根结点那还挺好处理,欸,有人问为什么要传2个参数?千万不能漏掉这两种情况!欸,是不是我只要满足。就可以解决这道题呢?

2025-07-22 21:34:51 326

原创 力扣刷题 -- 100.相同的树

注意:有几种特殊情况。

2025-07-21 22:00:23 313

原创 力扣刷题 -- 965.单值二叉树

【代码】力扣刷题 -- 965.单值二叉树。

2025-07-21 21:39:52 156

原创 快速通关二叉树秘籍(下)

在前面我们讲了底层是数组的二叉树,今天讲以链表为底层的链式二叉树。

2025-07-15 20:11:05 638

原创 堆的应用(讲解超详细)

说起排序,我们并不陌生,前面的冒泡排序就是其中之一,现在介绍一种新的排序方法 -- 堆排序。前面我们刚了解了堆排序可以得到最大/小值,那么这里我们能不能用堆排序来解决问题呢?第1步:建立有效的堆(什么叫有效的堆?-- 就是上节我们说的大根堆/小根堆);我们要找到前K个最大值,那是不是跟1个值比较,只要比它大,我就存放数据。说白了就是让我们找出前K个最大值/最小值。这里存放数据我们又得需要一个数组了。第2步:进行升序和降序操作。

2025-07-10 22:39:40 360

原创 快速通关二叉树秘籍(上)

(2)除根结点之外,其余的结点被分成互不相交的结点的集合,每个集合我们又可以看作一个子树(子树的结构和树的结构是类似的),这些子树的根节点有且只有一个前驱结点,可以有0个或者多个枝杈。因此在二叉树中常常使用递归来解决问题。注意:树形结构:每棵子树不能有交集非树形结构如图所示,子树存在相交的情况,都是非树形结构总结:(1)子树不相交;(2)每棵子树有且仅有一个根节点;(3)一个N个结点的树有N-1条边。

2025-07-03 00:30:47 891

原创 力扣刷题 -- 232. 用栈实现队列

2)插入数据往PushST插,判断PopST是否为空,如果为空直接往PopST出数据;如PopST不为空,就先把PopST的数据先出栈;1)创建两个栈空间,PushST,PopST;3)PopST全部出队列。

2025-06-03 21:28:45 251

原创 力扣刷题 -- 225. 用队列实现栈

2)将非空队列的前size-1个元素挪到空队列;3)将非空队列的队尾元素出队列,并返回栈顶元素。思路:1)往非空队列里插入数据(入队列);

2025-06-03 21:06:02 371

原创 力扣刷题 -- 20.有效的括号

第二步:观察示例,我们可以发现示例三是回文结构,示例四又是对称结构,看到这里还是没有思路。第一步:先看题目理解大意。题目中说左括号必须遇到。即()配对,{ }配对,[ ]配对。欸,这个思路好像可以!

2025-05-28 11:57:43 227

原创 快速通关栈和队列秘籍

栈的底层可以是数组,也可以是链表。不过相对于链表,数组的时间和空间复杂度都更低,所以一般使用数组。队列可以看作是栈的孪生兄弟,为什么这么说呢?:只允许一端进行插入数据,另一端只允许进行删除数据的特殊的线性表,具有。的原则(通俗理解就是后来者居上),我们把输入和删除的一端称为。栈是一种特殊的线性表,不过他很独特,他只能从。同样的道理,队列的实现的底层是什么呢?:删除数据叫出栈,删除数据也在栈顶。:插入数据叫入栈,插入数据在栈顶。出队列:删除数据的一端称为队头;Stack.c 文件。Queue.c 文件。

2025-05-28 11:28:15 485

原创 快速通关双链表秘籍

注意这里的带头链表中的head中是无效数据,只是占位置,也就是哨兵位!第一个有效节点是d1!在前面我们已经讲过单链表,但是链表只有这一种形式吗?虽然有这么多的链表的结构,但是我们实际中最常用法还是两种结构:单链表和双向带头循环链表。双链表全称:双向带头循环链表。

2025-05-16 12:03:32 299

原创 快速通关单链表秘籍

我们都看过火车吧,我们看到的火车是有一节一节的车厢相连接,这个链接的纽带我们可以抽象的看作指针链接,我们通过车厢链接去找到下一节车厢,在单链表中我们可以通过指针链接去找到下一个节点。同理我们也可以去修改对应的地址,去访问不同的结点空间。根据这幅图,我们plist就是头结点,通过plist里的存放的地址我们可以找到下一结点的位置,要找到下一节点,我们就必须的有它对应的地址,因此。:结点都是独立申请的(即需要插入数据时才去申请一块结点的空间),我们需要通过指针变量保存下一结点的地址才能找到下一个结点。

2025-05-16 00:19:17 1025

原创 快速掌握顺序表的秘籍

在前面我们已经学了C语言,C语言之后的又一大关卡就是数据结构。今天我们需要了解数据结构第一重大板块:顺序表。再这之前我们先来介绍一个线性表!!

2025-05-03 13:43:08 828

原创 力扣刷题 -- 206.反转链表

【代码】力扣刷题 -- 206.反转链表。

2025-05-02 15:38:56 322

原创 力扣刷题 - 203.移除链表元素

即当newTail!=NULL,因为如果原链表为空链表时,newTail为空指针,空指针是无法解引用的!:在这里我们已经有了一个链表,我们要在链表中去实现删除指定值的节点,返回新的头节点。因此,我们创建一个新链表,新链表的话就得有新的头节点和尾节点!这是就有人问为什么要有尾节点,那肯定是因为我们链表是有始有终的,如果没有尾节点我们就不知道链表末尾的情况。这里注意:我们创建的链表最开始肯定是空链表,但当我们插入一个节点后,就不再是空链表了!创建好之后,我们就开始遍历链表,找不为val的节点,存放到新链表。

2025-04-20 17:59:49 234

原创 力扣刷题 88. 合并两个有序数组

由于题目中已经告诉了这是一个有序数组,所以要将数组合并,我们可以先把nums2数组中的元素尾插到nums1中,再利用排序的方法实现有序。这里我们利用比较简单的冒泡排序:我们一趟一趟的去比较大小,调整数据的位置。当我们去运行代码的时候,系统报错说超出时间限制,这和前面的轮转数组类似,是因为时间复杂度太大(O(n^2)),所以存在更好的解决办法。

2025-04-17 15:56:53 248

原创 力扣刷题 -- 轮转数组

要实现轮转,我们可以先将最后一个元素nums[numSize-1]给拿出来,拿出来之后将数组中的所有数据整体往后移动1位,再把拿出的元素放到数组下标为0的位置,如此重复三次就能实现轮转。这里的方法1报了一个错误:时间超出限制!这是因为什么?这是因为我们的时间复杂度太大。至于到底什么时间复杂度?我会在下一篇会为你解答!这里时间超出限制说明我们的算法还不够最优,所以我们就要去思考第二种解决办法。写到这里我们以及优化了一次代码!那能不能在进一步优化呢?--- 答案当然是可以的。

2025-04-14 17:38:48 351

原创 力扣刷题--移除元素

要实现轮转,我们可以先将最后一个元素nums[numSize-1]给拿出来,拿出来之后将数组中的所有数据整体往后移动1位,再把拿出的元素放到数组下标为0的位置,如此重复三次就能实现轮转。

2025-04-14 17:31:43 286

原创 动态内存管理

在C语言中,我们创建变量需要向内存申请足够的空间来存放我们的数据。int main()//申请空间int a = 10;return 0;但是通过观察你会发现:(1)申请的空间大小都是固定值。(2)声明或者使用的时候必须确定空间大小。这个时候我们就想要一个可以自己定义的可变的空间大小,这就需要动态内存开辟的函数。万一还是有人不明白动态内存的具体含义呢?不要着急,往下看:例子:六年级4班班上总共30张座位,就说明这个班级有30个学生。

2025-03-29 16:21:36 821

原创 文件管理初识(下)

在上篇文章中,我们介绍了什么是文件?文本文件和二进制文件的区别?在文章最后还讲述了三组顺序函数。那么通过这篇文章我们再进一步学习文件管理!精彩内容,不要错过哦~

2025-03-22 21:39:32 326

原创 文件管理初识(上)

硬盘(磁盘)上的文件是文件。我们在代码的过程中,我们写的程序中的数据存储在电脑的内存中,如果程序退出,那么内存会回收所占用的空间,此时数据丢失。但你再次运行程序的时候,我们是看不到上次运行的数据结果。如果要将数据持久化保存,我们就可以创建文件。我们说所得文件一般分为两类:程序文件和数据文件。

2025-03-20 19:12:14 1081

空空如也

空空如也

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

TA关注的人

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