自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Linux基础指令

作用:更改文档或目录的日期时间或创建一个空文件,一般用来创建文件,加选项可 以更改时间。rmdir只能删除空目录,加选项-p,删除子目录后父目录为空,父目录也会被删除。ls -a显示的目录中有两个特殊的目录(.)和(. .),他们分别代表。作用:列出指定目录下的所有子目录与文件(不包括隐藏目录与文件)。选项 -f 强制删除,-r 删除该目录下所有文件和目录。列出该目录下的所有文件与目录(包括隐藏目录与文件)-d :将目录像文件一样显示,而不显示该目录下的文件。

2024-11-28 17:47:24 923

原创 红黑树(RBTree)

相比普通树的结点,增加了一个父指针,指向父亲。增加了一个常量表示颜色。通过一个pair对象和col构造一个Node,这里存储的数据依旧是键值对的形式。对于颜色,只有两种。采用枚举的形式。

2024-08-13 19:39:40 1047

原创 AVL树

由于会频繁计算左右子树的高度,对于结点的定义,多加一个成员_bf表示左右子树高度差。称为平衡因子。之前的二叉搜索树,存储的是key结构,这里存储的是<key,value>的键值对的结构。插入操作会引发旋转,需要找到父节点,所以增加一个父指针,指向父结点。结构如下:_kv(kv),_bf(0){}int _bf;// 右子树高度 - 左子树高度。

2024-08-11 12:58:22 716

原创 map和set的应用

count返回set内值为val的元素的个数,这个函数对于set没有太大作用。对于multiset比较实用,可以统计某个元素的次数。:关联式容器也是用来存储数据的,与序列式容器不同的是,其里面存储的是<key, value>结构的键值对,在数据检索时比序列式容器效率更高。两者的区别在于set不允许数据冗余,即不能存储相同的数据。最不同的为map支持[ ]的访问。lower_bound返回第一个大于等于val的元素的迭代器。upper_bound返回第一个大于val的元素的迭代器。的数据结构,里面存储的是。

2024-08-10 16:12:22 1200

原创 二叉搜索树

KV模型:每一个关键码key,都有与之对应的值value,即<key, value>的键值对。搜索树在大多数情况性能都比较好,但是最差情况下,会退化为单支树。K模型:K模型即只有key作为关键码,结构中只需要存储key即可,关键码就是要搜索到的值。这里按照左子树的值小于根节点的值,右子树的值大于根节点的值的方式实现。对于情况1:先找待删除结点,将这个结点的孩子交给这个结点的父亲管理。由于二叉搜索树的性质,不允许修改存储的数据,修改会破坏搜索树的性质。首先找到待删除的结点,方式和也是比较存储的数据的大小。

2024-08-07 16:04:15 416

原创 C++——多态

定义:在不同继承关系的类的对象,去调用同一函数,产生了不同的行为。称为多态。比如必须通过基类的指针或引用调用虚函数被调用的函数必须是虚函数,且派生类必须对基类的虚函数进行重写public:cout << "买票-全价" << endl;public:cout << "买票-半价" << endl;Student s;test(p);test(s);return 0;运行结果如下接口继承和实现继承。

2024-08-06 14:17:38 1138

原创 C++——继承

继承机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类或子类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前接触的复用都是函数复用,继承是类设计层次的复用。被继承的类为基类或父类,继承的类为派生类或子类。比如public:protected:// 姓名// 年龄protected:int _id;// 学号person类为基类,student类为子类。

2024-08-04 11:25:52 1058

原创 list的模拟实现

list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。list的底层是带头双向循环链表结构,双向链表中每个元素存储在相互独立的节点中,在节点中通过指针指向其前一个元素和后一个元素。list与forward_list非常相似:最主要的不同在于forward_list是单链表,只能单向迭代。与其他的序列式容器相比,比如array,vector,deque(双端队列),list通常在任意位置进行插入、移除元素的执行效率更好。

2024-07-30 16:58:22 1088

原创 vector的模拟实现

也是一个类,成员变量大多数情况是一个指针。通过对++,-- ,*,->,==,!=等运算符重载,使得遍历数据时,有一个统一的方法。而const迭代器,不允许修改数据,它和普通迭代器的差别只有重载*和->的返回值。因此增加两个模板参数,通过传不同的类型,实现出不同的类。当空间不够时(finish==end_of_storage),需要扩容。而erase时,如果删除pos位置的数据,那么也认为迭代器失效了。在vector类内,将迭代器添加进去即可,最终代码如下。指针指向的数据类型为T,因此指针的类型为T*

2024-07-26 14:23:29 486

原创 string的模拟实现

默认构造函数//默认构造函数函数参数为一个指针,用于初始化对象。在申请空间时,多申请一个是因为要存储 ‘/0’。函数声明的缺省值为"",空字符串。不能是空字符。拷贝构造和赋值重载//赋值运算符重载_str = tmp;//拷贝构造函数析构函数//析构函数if (_str!= nullptr)

2024-07-25 14:09:05 534

原创 C++——string的使用

可以将字符串内容清空,使之变成空串,改变size(变为0),不改变capacity。

2024-05-09 16:20:20 1153

原创 排序3——C语言

让每一个数都减去最小值,那么如果有负数,减去最小值(也是负数,可能是本身)之后的值肯定大于等于0,就可以满足数组的下标了。将序列分割,若子区间无序,对子区间再分割,直至子区间有序(只有一个数时)再进行合并(相当于合并两个有序数组)。不稳定,例子如下图,时间复杂度O(N*logN)空间复杂度O(logN)不稳定,例子如下图,时间复杂度O(N*logN)空间复杂度O(1)归并排序的缺点,空间复杂度为O(N),即额外需要一块辅助空间。不稳定,例子如下图,时间复杂度O(N^2)空间复杂度O(1)

2024-04-24 16:38:24 1230

原创 排序2——C语言

交换排序的基本思想:所谓交换,就是根据序列中两个记录键值的比较结果来对换这两个记录在序列中的位置。交换排序的特点是:将键值较大的记录向序列的尾部移动,键值较小的记录向序列的前部移动。

2024-04-23 16:06:31 791

原创 C++——类和对象练习(日期类)

对日期类进行一个完善,可以帮助我们理解六个默认成员函数,这里选择全部显式实现,包括构造函数,运算符重载,赋值重载等。对有之前的知识点的提示,以及注意事项,这里采用声明和定义分离的形式,下面代码放的全部是定义,除非必要说明。在最后会有完整的代码。包括头文件和源文件内的。

2024-04-22 20:29:00 886

原创 C++——初识模板

之前实现的数据结构,比如栈,我们为了便于修改存储的数据类型,通常使用typedef来重定义数据类型,但是这样有一个缺陷,会导致我们定义的栈存储的都是一种数据,如果同时需要两个栈,一个存储int,一个存储自定义类型,那么typedef就不管用了。比如:当用int类型使用函数模板时,编译器通过对实参类型的推演,将T确定为int类型,然后产生一份专门处理int类型的代码,对于字符类型也是如此。概念:函数模板代表了一个函数家族,该函数模板与类型无关,在使用时被参数化,根据实参类型产生函数的特定类型的版本。

2024-04-22 16:27:09 1109

原创 C/C++内存管理

对于用法上,建议不要混用,即malloc出来的空间就用free释放,new出来的空间就用delete释放。是系统提供的全局函数,new在底层调用operator new全局函数来申请空间,delete在底层通过operator delete全局函数来释放空间。operator new内部是通过malloc来申请空间的,operator delete内部是通过free来释放空间的。先在空间上执行析构函数,然后完成对象中资源的清理工作,通过调用operator delete函数释放对象的空间。

2024-04-21 16:38:07 1071

原创 C++——类于对象(三)

定义时不添加static关键字,类中只是声明。类的静态成员可以用。

2024-04-20 18:57:28 650

原创 C++——类与对象(二)

以上的六个成员函数,我们不显式实现,编译器会自动生成,如果我们显式实现了,编译器就不会生成了。拷贝构造函数和赋值重载需要注意浅拷贝的问题。对于const成员函数,如果在函数内部没有对*this进行修改,那么建议加const。介绍了这六个函数,我们会对日期类和栈进行完善,加深对这六个默认成员函数的理解。本篇就到这里咯。

2024-04-20 12:22:57 902

原创 C++——入门基础语法(2)

这是因为函数展开后就没有函数地址,会导致链接时找不到函数,产生链接错误。如下。

2024-04-16 16:57:24 827

原创 排序1——C语言

排序在生活中很常见,比如在网购时,按价格排序,按好评数排序,点餐时,按评分排序等等。而排序有快和慢,快的排序效率高,慢的排序效率低,需要的时间也多。下面就一一介绍各种排序。介绍排序算法时,统一以为例。

2024-04-13 16:39:17 1010

原创 C++——类与对象(一)

和C语言中的结构体一样,不同的是。

2024-04-13 14:12:41 779

原创 数据结构OJ题——栈和队列

假设入队数据1,2,3,4,5由于需要实现栈,那么出数据的顺序需要是5,4,3,2,1,效仿上一题,将数据倒入到另一个队列后,发现再出数据还是1,2,3,4,5,因此这个方法不适用了。需要出的数据是5,所以可以考虑把1,2,3,4倒入到另一个队列,再把5出出去。把1,2,3倒回来,把4再出出去,循环就可以实现出数据的顺序为5,4,3,2,1了。假设入队的顺序是1,2,3,4,5,那么出队的顺序也需要是1,2,3,4,5。此时我们从stack2中出数据会发现,出队的顺序变成了1,2,3,4,5。

2024-04-10 15:32:27 1348

原创 数据结构算法题 2(力扣)——链表

fast指针先走k步,之后和慢指针以相同速度走,快指针为NULL时,慢指针指向的结点就是倒数第k个结点。本题需要注意k的值,k可能很大,比如远大于结点的个数,当k等于结点的个数时,所有结点向右移动k个位置相当于不用移动,因此需要对k进行求余操作。指针含义:cur——指向新链表的头,prev——cur的前一个结点,tail——指向最后一个结点。为了便于将结点链接到大小链表中,采用带头结点的方式解决,可以避免大小链表为空或者不为空的讨论。当遍历完链表后,可能出现链表成环的情况,因此需要将大链表的尾指针置空。

2024-04-08 17:49:38 1129

原创 数据结构——堆的应用

堆结构主要有两个应用:1、堆排序 2、topK问题。

2024-04-06 16:17:46 1333

原创 数据结构二叉树链式存储

的结构体。

2024-04-06 15:01:05 892 1

原创 数据结构算法题(力扣)——链表

以下题目建议大家先自己动手练习,再看题解代码。这里只提供一种做法,可能不是最优解。

2024-04-03 20:56:54 1094 1

原创 数据结构二叉树顺序存储——堆

完全二叉树中,下标为n-1的双亲结点的下标为[ ( n - 1 ) -1 ] / 2 即。

2024-04-02 17:00:38 1205 1

原创 C++——入门基础语法

C语言作为最基础最底层的语言,也是我们学习的第一门编程语言,但是它有许多不足,比如命名冲突等,C++很好的解决了这些不足。C++是在C语言的基础上不断增加新的语法,不断的加东西进而产生的一门语言,因此C++是源于C语言的。

2024-03-31 16:28:34 886 1

原创 数据结构——树

树是一种非线性的数据结构,是由有限个结点组成的具有层次关系的集合,形状看起来像一棵倒挂的树,因此叫做树。树具有一个特殊的结点,叫做根节点,该结点没有前驱结点。除根节点外,其他结点有且仅有一个前驱结点,有零个或者多个后继结点。这些结点又被分为若干颗树,每棵树没有交集,每棵树又被分为根节点和子树。因此,树是递归定义的。如下图,就是一棵树。

2024-03-29 17:25:41 1003 1

原创 数据结构——队列

假如只使用一个头指针指向队头,那么每次插入数据时都需要遍历链表找到尾结点,效率低下,因此选择增加一个尾指针,指向尾结点。同样分为两种情况,队列只有一个结点和多于一个结点。实现队列时可以选择数组或者链表,如果选择数组实现,那么在删除数据时会造成数据的挪动,效率低下,因此这里选择使用链表实现队列。关于队列就介绍这些了,学会这么多数据结构后,需要多多的练手,保持手感,不要让自己手生,因此后面会带大家写一些题目。队列只允许在一端进行数据的插入,在另一端进行数据的删除,插入数据的一端叫队尾,删除数据的一端叫队头。

2024-03-26 15:32:14 1018 1

原创 数据结构——双向链表

尾结点的下一个是头结点,头结点的前一个是尾结点。对于尾插,可以看成在尾结点后插入,也可以看成在头结点(head)前插入,因为head的前驱结点就是尾。next是一个地址,=是赋值,改变指针的指向就是修改结构体内指针的值,也就是修改地址。初始化双链表就是开辟一个头结点并返回,只有一个结点时,链表的前一个和后一个都是自己。pos是一个结构体指针,插入是在pos前插入,删除就直接删除pos位置的结点。头删,即删除第一个结点,也就是头结点的下一个,但是不包括头结点。销毁时,遍历链表释放其余结点后,在释放头结点。

2024-03-24 18:30:30 1226 1

原创 数据结构——栈

入栈非常简单,因为top是指向栈顶位置的下一个,那么入栈就是将数据放在top处,在++top即可。栈是一种特殊的线性表,只允许在栈的一端入数据和出数据,这一端称为栈顶,另一端称为栈底。栈的一些操作包括入栈,出栈,获取栈顶元素,获取栈的大小,判空,初始化和销毁等。在初始化时,top的值可以为-1或者0,如果是-1,说明top位置处是栈顶。比如入一个数据就出一个数据,那么出栈顺序就变成了1,2,3,4,5。出栈顺序是5,4,3,2,1。但不一定就是5,4,3,2,1。入数据时称为入栈或进栈或压栈,出数据时(

2024-03-23 16:25:51 433 1

原创 数据结构——链表

链表是一种物理结构上非连续,非顺序的存储结构。数据元素的顺序是通过链表中的指针链接起来的。顺序表在插入数据时,可能会扩容,造成一定的消耗,如果新插入的数据量小,也会造成一定的空间浪费。链表可以很好的解决这两个问题。但链表也有其他不足。

2024-03-17 18:14:12 515 1

原创 数据结构——顺序表

顺序表分为动态顺序表和静态顺序表,静态顺序表底层是一个定长数组,不方便进行增加。任意位置的插入和删除需要注意插入和删除的位置需要合理,和头插,头删类似。用的数据结构,而顺序表就是一种线性表,常见线性表还有链表,栈,队列,字符串等。我们需要知道这个数组能存的数据最多是多少,还需要知道当前存了多少数据。插入分为头插和尾插,尾插比较容易实现,只需要根据下标进行插入即可。头插需要将数据向后移动一位,在进行插入,因此头插的消耗比较大。头插时,需要从最后一个数据开始,依次向后移动数据。查找数据,只需要依次比对。

2024-02-29 20:26:57 570 2

原创 C实现贪吃蛇

Windows 这个多作业系统除了协调应用程序的执行、分配内存、管理资源之外, 它同时也是⼀个很大的服务中心,调用这个服务中心的各种服务(每⼀种服务就是⼀个函数),可以帮应用程序达到开启视窗、描绘图形、使用周边设备等目的,由于这些函数服务的对象是应用程序(Application), 所以便称之为 Application Programming Interface,简称 API 函数。要实现这样的一个小游戏,需要掌握结构体,指针,链表,函数,分支循环语句,枚举等,绝大部分的C语言知识都运用到了。

2024-02-24 17:41:51 925

原创 【部分C语言函数解析】

大家可以在下面这个网站上学习C以及C++,里面内容很多,很详细。使用下面的函数需要包含一个头文件。

2024-02-15 14:57:23 939 1

原创 简易扫雷(仅用函数和数组实现)

扫雷是一款比较传统的游戏,游戏规则是,选择一个格子,如果不是雷,则安全,继续寻找其他雷,如果是雷,游戏结束。当找到全部的雷时,游戏则通过。如上,游戏失败,点击的格子中的数字代表周围的格子一共有那么多个雷。中间的2代表周围有2个雷中间的1代表周围有1个雷,根据最中间的1,得到还未点击的格子就一定是雷。这里仅用函数和数组外加一些细小知识,带大家实现一个简易的扫雷,使大家学到的知识得到运用。

2024-01-28 13:51:31 939 1

原创 指针解析(3)

由于(二)的内容较少也比较简单,这里就不带大家复习了,直接进入正题。

2023-12-19 16:45:30 902 1

原创 指针解析(2)

上节我们介绍了创建指针变量和指针变量类型及其意义,指针加减整数和指针减指针的内容,还有一个小小的应用。指针变量是存储地址的变量,需要用到&符号,名叫取地址操作符,创建指针变量时需要给定变量类型变量名,和赋初值,如果不赋初值会导致一个野指针的问题,关于野指针,本节会介绍到。//整型指针变量//字符指针变量,不知道赋值什么时,可以给一个NULL指针//数组指针,//函数指针return 0;

2023-12-17 16:08:45 994 1

原创 关于大小端的介绍

对于0x11223300这个数来说,11是数值较大的一端,也就是通常说的高位,00这一端是低位,数值大的存在了高地址处,数值小的存在了低地址处,所以我的电脑是以小端字节序存储。a里保存了一个16进制的数字11223344,将a的地址取出,强转为char*类型,保存在ch这个指针变量,对ch进行解引用并赋值为0,最后以16进制的形式打印a的值,这段代码就解读完了。可以看到,最后的44改为了00,通过指针(1)的学习,知道了,char*类型的指针解引用可以访问一个字节。

2023-12-10 15:55:45 417 1

空空如也

空空如也

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

TA关注的人

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