自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 数据结构——树

的。随便举例一棵树,如注:树形结构中,子树之间不能有交集,否则就不是树形结构Ⅱ. 树中的相关概念我们以下面这个树为例。

2023-06-01 23:42:25 1090 4

原创 C++库函数——string类

源文档译:1.字符串是表示字符序列的类2.标准的字符串类提供了对此类对象的支持,其接口类似于标准字符容器的接口,但添加了专门用于操作单字节字符字符串的设计特性。3. string类是使用char(即作为它的字符类型,使用它的默认和分配器类型关于模板的更多信息,请参阅basic_string)。4. string类是模板类的一个实例,它使用char来实例化模板类,并用char_traits和allocator作为的默认参数根于更多的模板信息请参考。5.

2023-06-01 18:38:20 7835

原创 算法——各排序算法效率对比和总结

对于排序我们有如下的导图且一谈到排序,我们都有下图。

2023-05-21 14:17:23 1242

原创 C++基础语法——模板

目录1. 泛型编程2. 函数模板①概念②使用③原理 ④实例化 ⑴隐式实例化⑵显式实例化3. 类模板①格式②实例化在平常的编写中,对于一个实现固定作用的函数,如交换两变量的值的Swap函数,对于不同类型只能编写相对应的重载函数,即 对于这样的函数重载,有一些不利之处那我们能否告诉编译器一个模子,让编译器根据不同的类型利用该模子来生成代码呢?答案是肯定的,而这又与泛型编程有关而在这之中模板是泛型编程的基础。模板也分为函数模板与类模板 函数模板由一个或多个类型参数组成,其中类型参数使用特殊的语法来声明为

2023-05-20 23:08:59 2717

原创 算法——归并排序和计数排序

归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。图示如下。

2023-05-20 13:46:20 772

原创 Linux基础——权限

在操作系统中,权限是指用户或进程能够执行的特定操作的范围。权限决定了一件事情能否被做。而在权限进行判断时首先认证的是身份,而Linux中身份又分为拥有者,所属组和其他人,这些身份与用户(root用户和普通用户)互相交叉,即root用户与普通用户都可能是这三个身份中的一个。在之后,查看文件的属性,在使用ll指令后,我们可以看到可以发现,最前方由10个字符组成,在这之中的第一列,即表示的是文件的类型(因此在Linux中文件名后缀无直接意义),具体如下d:文件夹:普通文件l:软链接(类似。

2023-05-19 21:44:28 2034

原创 C++基础语法——内存管理

而在处理自定义类型时,new会先调用operator new函数再调用自定义类型的构造函数,而delete会先调用析构函数再调用operator delete函数。newdelete为什么要如此设计呢,我们举一个具体例子来说,比如我们要在堆上申请一个栈对象int main()delete st;return 0;有。

2023-05-18 15:05:36 1140

原创 Linux基础——指令

在Windows环境下,对于复制粘贴我们常常使用ctrl+c/ctrl+v,但是这在Linux环境中是不适用的,而在我所使用的xshell软件中,使用来进行,使用来进行。

2023-05-14 23:09:31 1053

原创 C++基础语法——类和对象

构造函数是一个特殊的成员函数,名字与类名相同创建类类型对象时由编译器自动调用,以保证每个数据成员都有一个合适的初始值,并且在对象整个生命周期内只调用一次。注:构造函数虽然名称叫构造,但是构造函数的主要任务并不是开空间创建对象,而是初始化对象。析构函数:与构造函数功能相反,析构函数不是完成对对象本身的销毁,局部对象销毁工作是由编译器完成的。而对象在销毁时会自动调用析构函数,完成对象中资源的清理工作。拷贝构造函数:只有单个形参,该形参是对本类类型对象的引用(一般常用const修饰)

2023-05-12 20:44:25 1346

原创 C++应用实例——日期类的实现

我们使用如下代码来使用并检测。对于流输入与流输出有。

2023-05-10 17:12:15 660

原创 算法——冒泡排序与快速排序

1.冒泡排序是一种非常容易理解的排序2.时间复杂度:O(N^2)3.空间复杂度:O(1)4.稳定性:稳定1.快速排序整体的综合性能和使用场景都是比较好的,所以才敢叫快速排序2.时间复杂度:O(N*logN)3.空间复杂度:O(logN)4.稳定性:不稳定。

2023-05-09 11:27:19 454

原创 算法——选择排序与堆排序

1.选择排序思考非常好理解,但是效率不是很好。实际中很少使用2.时间复杂度:O(N^2)3.空间复杂度:O(1)4.稳定性:不稳定1.堆排序使用堆来选数,效率就高了很多。2.时间复杂度:O(N*logN)3.空间复杂度:O(1)4.稳定性:不稳定。

2023-05-05 20:44:07 220

原创 算法——插入排序与希尔排序

1.元素集合越接近有序,直接插入排序算法的时间效率越高2.时间复杂度:O(N^2)3.空间复杂度:O(1),它是一种稳定的排序算法4.稳定性:稳定希尔排序的特性总结:1. 希尔排序是对直接插入排序的优化。2.当gap > 1时都是预排序,目的是让数组更接近于有序。当gap == 1时,数组已经接近有序的了,这样就会很快。这样整体而言,可以达到优化的效果。我们实现后可以进行性能测试的对比。3.希尔排序的时间复杂度不好计算,因为。

2023-05-05 16:31:24 134

原创 C++基础语法——引用

不是新定义一个变量,而,编译器不会为引用变量开辟内存空间,它和它引用的变量。

2023-04-21 23:45:48 98

原创 C+基础语法——缺省参数与函数重载(含底层原理)

如果在函数调用时,我们只给出了第一个和第三个参数,那么编译器就无法确定第二个参数的默认值,因为它不知道第三个参数的值。这样,使用缺省参数可以使函数调用更加方便,因为调用者只需要传递那些必须的参数,而不必为所有参数都指定一个值。在这里如果我们知道要插入的数据个数为多少时,就可以提前调整,不用频繁的扩容影响效率,且如果不知道要插入多少数据时,依旧可以只传入一个参数。,显而易见,在C语言中各个函数所生成的符号表是根据函数名来生成的,因此C语言不能实现函数重载。是指在函数定义中,为函数的一个或多个参数。

2023-04-19 19:14:25 477

原创 数据结构——循环队列

目录1.循环队列的基础结构2.循环队列的数据操作①判断循环队列是否为空②判断循环队列是否为满③创建循环队列④循环队列插入数据⑤循环队列弹出数据⑥取得队首元素⑦取得队尾元素⑧循环队列的销毁3.循环队列的优势与劣势①优势②劣势循环队列是一种基于数组实现的队列,具有头指针front和尾指针rear。front指向队头元素,rear指向队尾元素的下一个位置,这样空队列时,front == rear;而队列满时,(rear+1)%n == front,其中n为数组的大小,表示rear再循环一圈后到达队头位置。因此我们

2023-04-14 09:44:43 837

原创 C++基础语法——命名空间(namespace)与输入输出流(iostream)

如在A文件内名为namespace N定义了a元素,在B文件内也有名为namespace N定义了b元素,在最后运行时,系统会自动将它们合成在一起,因此如果使用了相同名字的变量则会报错。且如果在全局中没有搜索到对应变量后,不会自动到命名空间域中去寻找,因此需要我们使用using namespace xxqsg手动展开,如下。变量、函数和后面的类都是大量存在的,这些变量、函数和类的名称将都存在于全局作用域中,可能会导致很多冲突。使用命名空间的目的是。在使用变量时,程序搜索变量是有先后顺序的,一般来说是。

2023-04-13 09:24:12 414 1

原创 数据结构——队列

队列的容量有限:队列的容量是有限的,即队列能够容纳的元素数量是有限的。队列的头部保存的是最先进入的元素,而队列的尾部保存的是最后进入的元素。队列的插入和删除操作的时间复杂度都为O(1),但在使用数组实现的队列中,插入和删除操作可能会导致元素的移动,造成额外的时间和空间开销。队列的数据存储必须是顺序的:队列只能在队列的头部删除元素,在队列的尾部添加元素,数据的存储必须是顺序的,不适合随机访问和修改数据。队列的检索操作效率较低:在使用数组实现的队列中,查找队列中某个元素的效率较低,需要遍历整个队列来查找。

2023-03-30 19:20:17 493

原创 数据结构——栈

因此我们可以得到栈的结构定义如下。

2023-03-28 17:04:40 139

原创 力扣日常刷题——(142环形链表Ⅱ、138复制带随机指针的链表)

方法1:将每一个节点复制使其处于本节点之后,下一个节点之前,复制完成之后,使每个复制节点的random指针指向前一个节点的random指针指向的节点的下一个节点,遍历一遍之后,将这些复制节点分别摘出,形成一个链表并返回。方法1:使用快慢指针先使慢指针追到快指针,之后分别使两指针从起始点和相遇点开始向后移动,最终会在入环点相遇(推导如下)

2023-03-23 21:25:12 119

原创 力扣日常刷题——(160相交链表、141环形链表)

方法1:分别测出A,B链表的长度,再记录它们的差值,先使较长的链表走差值步,然后两个链表同时向后移动,当某一时刻它们指向的下一地址相同时那么下一地址就为相交点。方法1:使用快慢指针,快指针一次走两步,慢指针一次走一步,因为相差的步长为一步,所以如果有环的话最终慢指针会追上快指针,而如果没有环的话快指针就会先一步走到空。

2023-03-18 11:30:56 113 1

原创 数据结构——双向带头循环链表

双向带头循环链表(Doubly Circular Linked List)是一种数据结构,它与普通链表类似,但是每个节点除了有指向下一个节点的指针外,还有指向前一个节点的指针,而且它的头节点指向尾节点,尾节点也指向头节点,形成了一个循环。因此,我们能得到它的基础结构为。

2023-03-17 20:47:19 95 1

原创 牛客网日常刷题——(CM11链表分割、OR36链表的回文结构)

方法1:分别给出两个带有哨兵位的链表,一个链表存放小于x的节点,一个存放其它的节点,最后将第二个链表链接到第一个链表的尾节点上,返回第一个链表的哨兵位的下一节点。方法1:找到链表的中间节点,并将后面一半的链表逆置,再将头结点和逆置后的头结点一一比对,直到前面的头结点为空为止。(详情请看链表中间节点(

2023-03-16 20:40:42 130

原创 力扣日常刷题——(206反转链表、21合并两个有序链表)

方法1:分别比较两个链表中对应两个的值,创建一个新链表,将其中较小的值尾插到新链表上,当某一链表元素数值均插入完成时,再将另一个链表剩余的部分尾插到新链表上,最后返回新链表。方法1:使用三个指针pre,cur,next分别指向上一个节点,本节点和下一节点,每次将cur指向next的指针改成指向pre,这之后使这三指针都向后移,不断迭代得到结果。方法2:创建一个新链表,将各个节点分别头插到新链表中,最后返回新链表。

2023-03-15 17:41:07 118 1

原创 力扣日常刷题——(876链表的中间节点、203移除链表元素)

方法1:用前后两个指针分别指向不同节点,当后面的指针指向的节点值等于目标值时,后面的指针跳过这一节点并将其释放,不断迭代得到最后结果。方法1:遍历数组一遍后用count记录总节点数,这之后使用count/2再次从头遍历,找到中间节点并返回。方法2:使用快慢指针,慢指针一次走一步,快指针一次走两步,当快指针走到结束时,慢指针指向的就是中间节点。方法2:创建一个新链表,不是val值的就尾插在它的后面,反之则不进行。因为方法一较为容易实现,这里先实现方法二。

2023-03-15 15:59:30 142 2

原创 数据结构——单链表

单链表在创建前,我们需要知道,在单链表中我们需要插入数据,在插入数据之后还需要一个链表指针(用于指向下一数据的存储位置),因此我们便能得到单链表的结构如下。

2023-03-10 15:15:24 72

原创 数据结构——动态顺序表

顺序表在创建时,我们需要知道,在顺序表中我们要插入数据,在插入数据之后有当前的有效空间,因此我们便能得到顺序表的结构如下。

2023-03-06 21:47:29 79 2

原创 动态内存管理(C语言)

C语言提供了一个动态内存开辟的函数:malloc。(图为malloc函数的原型)这个函数向内存申请一块连续可用的空间,并返回指向这块空间的指针。1.如果开辟成功,则返回一个指向开辟好空间的指针。2.如果开辟失败,则返回一个NULL指针,因此malloc的返回值一定要做检查。3.返回值的类型是 void* ,所以malloc函数并不知道开辟空间的类型,具体在使用的时候使用者自己来决定。4.如果参数 size 为0,malloc的行为是标准是未定义的,取决于编译器。

2023-02-24 08:45:22 120

原创 指针全面剖析

数组指针是指针?还是数组?答案是:指针。通过类比我们可以知道那么下面的代码哪个是数组指针呢?答案是第二个在第二个中p先和*结合,说明p是一个指针变量,然后指向的是一个大小为10个整型的数组。所以p是一个指针,指向一个数组,叫数组指针。注意:[]的优先级要高于*号的,因此必须加上()来保证p先和*结合。同理可知,第一个是一个指针数组,它是一个有着十个整形指针元素的数组。

2023-02-11 22:18:42 244 2

原创 数据在内存中的储存

整形在内存中的储存我们之前讲过一个变量的创建是要在内存中开辟空间的。空间的大小是根据不同的类型而决定的。那接下来我们谈谈数据在所开辟内存中到底是如何存储的?int a = 20;我们知道为 a 分配四个字节的空间。那如何将其存储起来呢?C语言的整型算术运算总是至少以缺省整型类型的精度来进行的。为了获得这个精度,表达式中的字符和短整型操作数在使用之前被转换为普通整型,这种转换称为整型提升。整型提升的意义。

2023-01-11 15:00:27 195 4

原创 C语言底层剖析——函数栈帧

相信大家和我一样,在编程的时候常常会灵光一现,想到一些问题,比如说:局部变量是怎么创建的?为什么局部变量的值是随机值?函数是怎么传参的?传参的顺序是怎样的?形参和实参是什么关系?函数调用是怎么做的?函数调用是结束后怎么返回的?但是经过我们大脑的高速运转后,我们得到了一个结论——我怎么会知道这些是什么原理啊?那今天就让我来带你体会一下这些问题背后隐藏的"boss"——函数栈帧。以上便是函数栈帧的创建和销毁的全过程啦,希望你能在本文中有所收获!

2022-12-16 21:08:46 314 2

原创 轻轻松松看懂分支与循环,不进来看看吗?(二)(附导图)

知晓本文的知识与导图后,希望大家能够有所收获!

2022-11-23 17:09:11 705 4

原创 轻轻松松看懂分支与循环,不进来看看吗?(一)

看完本文后,你会不会有如下感觉,啊,原来分支语句竟然是这样子进行的啊,那么恭喜你已经成功踏入了学习编程的道路,愿学习路上你我为伴,共向远行!

2022-11-18 21:15:17 230 5

原创 趣味小游戏——扫雷(优化版)

这里是趣味小游戏第二篇,扫雷想必也是大家以前电脑上必备的休闲游戏,那么今天我就来带大家用代码的方式来回忆并实现它吧!以上就是扫雷游戏的全部实现过程了,希望各位程序员能够玩得开心,同时也希望能从本文中得到灵感与启发!

2022-11-13 20:35:15 1311 8

原创 趣味小游戏——井字棋

想必大家在小时候或多或少的都接触过井字棋吧,那么今天我就来带大家了解如何在编程中实现这一游戏吧。

2022-11-09 18:01:41 1746

原创 C语言指针底层

希望读者在阅读完本文后,能够加深对指针的理解. 1.指针是什么? 指针本质上是一种变量,是专门用来存放地址的一类变量。那么如何理解指针呢,我们常常能听到一句俗语“跑得了和尚,跑不了庙”,而这里的“庙”就可以当作“和尚”的地址,我们可以通过“庙”这地址来找到“和尚”,而我们在C语言中将这地址称为指针。

2022-10-20 23:48:23 310 2

原创 初识C语言

大家好,我是第一次发表文章的轩轩,是一名才开始学习C语言的小白。在学习了将近6个小时后,我才逐渐认识到了编程的魅力,C语言的魅力,它极其注重逻辑,任何一个细节上的处理不当都会带来错误的结果。因此,我又萌发出了学习其他语言的想法,诸如C++ java 等计算机语言,在b站上学习并理解各种代码的含义,目前来说我的重心还是在学习C语言的基础上,同时劳逸结合也必不可少每天抽时间学3-4个小时就好,以后也希望能够进入华为、腾讯这样的大厂,希望能够与君共勉,共同前往希望的未来。...

2022-08-08 22:56:11 159

空空如也

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

TA关注的人

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