- 博客(33)
- 收藏
- 关注
原创 【C++类和对象(中)】—— 我与C++的不解之缘(四)
对于自定义类型,无论我们写函数不写析构,都会自动调用其析构函数。public://构造函数return;_top = 0;//析构函数~Stack()if (_arr)free(_arr);int _top;return 0;
2024-08-13 12:57:18
1816
89
原创 【C++类和对象(上)】—— 我与C++的不解之缘(三)
class 为定义类的关键字,Stack为类的名字,{}中为类的主体(注意类定义结束后的分好不能省略),类体中内容称为类的成员:类中的变量称为类的属性(或者 类的成员变量);类中的函数称为类的方法(或者 类的成员函数)。为了区分成员变量,(习惯上会加上一个特殊标识,前面或者后面加上_或m(这只是惯例,C++ 没有要求))。C++中struct也可以定义类,C++兼容C语言struct的用法,而且把struct 升级成了类(可以定义成员函数),一般还是使用class 来定义类。
2024-08-07 21:15:49
923
62
原创 【C++入门(下)】—— 我与C++的不解之缘(二)
引用不是新定义一个变量,而是给已存在的变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量公用一块内存空间。类型 & 引用别名 = 引用对象;int& b = a;//这里b是a的别名//也可以给b去别名int& c = b;int& d = c;return 0;
2024-08-06 21:54:49
1128
65
原创 【C++入门(上)】—— 我与C++的不解之缘(一)
定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接一对{}即可,{}中即为命名空间的成员。命名空间中可以定义变量/函数/类型等等。namespace本质上是定义出一个域,这个域跟全局域各自独立,不同的域可以定义同名变量,所以下面的rand就不存在冲突(可以解决如上图所示命名冲突问题)。C++ 中域有函数局部域、全局域、命名空间与和类域;域影响的编译时语法查找一个变量/函数/类型出处(声明和定义)的编辑,所以有了域的隔离,名字冲突问题就解决了。
2024-08-03 14:17:26
1386
65
原创 【排序算法(二)】——冒泡排序、快速排序和归并排序—>深层解析
接上篇,排序算法除了选择排序(希尔排序)和插入排序(堆排序)之外,还用交换排序(冒泡排序、快速排序)和归并排序已经非比较排序,本篇来深层解析这些排序算法。
2024-07-30 20:48:34
1094
48
原创 【二叉树】—— 算法题
利用二叉树的递归思想,判断每一个节点值与其左右子节点的值是否相等,如果遇到空节点,就返回true(说明每一个节点值都相等);如果该节点的值与其左右子节点的值都相等,就接着递归该节点的左右子树。这里首先求二叉树的节点个数;利用相同的树的方法,判断二叉树根节点的左右子树是否对称(判断对称直接判断一个节点的左子树和另一个节点的右子树是否相等即可)。遍历到节点都不为空,且值相等,继续遍历 (这因为3的左右节点都为空,就一步带过)遍历结束,没有遇到一个节点为空一个节点不为空或者值不相等的情况,就返回true。
2024-07-28 21:52:15
954
22
原创 【数据结构】二叉树链式结构——感受递归的暴力美学
查找相对来说就比较简单了,遍历二叉树,为空就返回NULL,值为x就返回该节点的地址,如果遍历过程中函数返回值不为NULL,就证明找到了,直接返回即可。访问4这个节点的右子树,也为空,此时节4这个点为根节点的左子树已经访问 结束了,回退到其父节点的函数栈帧,访问其父节点的右子树。这里,3这个节点的左右节点都为空,访问就直接返回,回退到根节点,就说明根节点的右子树访问已经结束,此时二叉树已经变了结束。再访问根节点5的左子树。遍历二叉树,遍历到空节点就返回0,不是空节点就返回其左子树和右子树节点个数之和再加一。
2024-07-26 23:23:03
860
44
原创 【数据结构】二叉树——顺序结构——堆及其实现
树是一种非线性的数据结构,它是由n(n>=0)个有限节点组成的一个具有层次关系的集合。除根节点外,其余部分被分为M(M>0)个互不相交的集合T1、T2、.....Tm,其中的每一个集合 Ti(1 <= i <= m)又是一颗结构与数类似的子树。每一颗子树的根节点都有且只有一个前驱节点,而可以有0个或者多个后继节点。树是递归定义的。在树形结构中,子树之间不能存在交集子树中存在交集,就不是树形结构了除了根节点以外,每一个节点有且只有一个父节点如图,E节点存在两个父节点,该图不是树形结构。
2024-07-23 23:38:55
1319
42
原创 【栈和队列】算法题 ---- 力扣
假设依次插入了1,2,3三个数据,现在要出栈将q1中数据size-1(2个)导入到q2中。现在q1当中剩余的数据就是要出栈的数据(即栈顶)。这样就满足了栈先进先出的特点。
2024-07-21 22:08:56
1659
43
原创 【数据结构】--- 栈和队列
前面学习了数据结构的顺序表、单链表、双向循环链表这些结构;现在就来学习栈和队列,这里可以简单的说栈和队列是具有特殊化的线性表。
2024-07-18 20:07:27
1409
31
原创 【链表】算法题(二) ----- 力扣/牛客
遍历链表,fast每次向前走两步,slow每次向前走一步,如果链表存在环,fast与slow指针一定会相遇;再定义两个指针从相遇节点和链表头结点开始遍历,两个指针相遇时的节点就是链表环的起始节点。先在原链表的基础上创建节点,形成新的链表,再给链表节点的random指针赋值,最后断开新链表和原链表的连接即可。找到链表的中间节点,然后逆置链表的后半部分,再一一遍历链表的前半部分和后半部分,判断是是否为回文结构。判断两个链表是否相交,如果相交就返回相交节点,如果链表不相交,那就返回NULL;
2024-07-16 18:04:08
1060
34
原创 【链表】算法题(一) ----- 力扣 / 牛客
看到这个题,本人一开始的想法是:遍历一遍链表,记录链表的节点个数,然后再遍历一次链表,寻找链表的中间节点;合并两个有序链表,这里创建一个新的链表,将两个链表中较小小的数据依次尾插到新链表中,最后返回新链表的头节点即可。题目上这样说,我们就可以创建一个新的链表,将值不为val的节点,尾插到新的链表当中,最后返回新链表的头节点。到这里,l2已经遍历到了NULL,循环结束,此时l1指向的就是反转后链表的头节点,直接返回即可。循环到这里,fast为空,循环结束,此时slow指向的节点就是链表的中间节点。
2024-07-14 21:53:27
1258
21
原创 【顺序表】算法题 --- 力扣
这个题让我们移除数组nums中值为val的元素,最后返回k(不是val的元素个数)这样显然我们就不能再创建一个数组来解决这个问题了,只能另辟蹊径思路:双指针这里定义两个指针(l1,l2)(l1,l2是整数,通过下标访问数组元素)都指向数组的起始位置,然后循环判断l1指向的元素是否等于val?如果等于,就让l2++;如果不等于,那就将l2的值赋给l1指向的元素,然后l1++,l2++。这样遍历完数组后,l1的值就是不等于val的元素的个数。
2024-07-12 21:22:38
929
7
原创 【C语言】实践:贪吃蛇小游戏(附源码)
贪吃蛇小游戏想必大家都玩过吧,现在就要C语言代码来实现一下贪吃蛇小游戏在实现之前,我们要对C语言结构体指针链表(单链表)有一定的基础先来看一下预期运行效果。
2024-07-12 20:11:46
1480
10
原创 【数据结构与算法基础】——算法复杂度
算法就是定义良好的计算过程,它取一个活一组的值输入,并产生出一个或一组值作为输出。简单来说,算法就是一系列的计算步骤,用来将输入数据转化成输出结果。
2024-07-10 11:15:36
860
2
原创 【数据结构】——双向链表详细理解和实现
双向链表是一种带头双向循环的链表。在双向链表中,首先存在着一个头结点;其次每个节点有指向下一个节点的指针next 和指向上一个节点的指针prev;最后,双向链表的头结点中存放上一个节点的指针指向链表的尾节点,尾节点中存放下一个节点的指针指向链表的头结点,形成一个闭环。这样双向链表既可以从前遍历,也可以从后遍历,直到回到起点。一、链表的分类链表的结构多种多样,链表呢可以是带头(不带头)、双向(单向)、循环(不循环)的,我们之前实现的单链表其实就是不带头,单向,不循环的链表。而这些有什么区别呢?
2024-07-08 11:04:55
1362
5
原创 【数据结构】——单链表实现
链表和顺序表都是线性表的一种,但是顺序表在物理结构和逻辑结构上都是连续的,但链表在逻辑结构上是连续的,而在物理结构上不一定连续;来看以下图片来认识链表与顺序表的差别这里以动态顺序表为例,和链表中的单链表对比一下动态顺序表单链表这里就可以很清晰的看到顺序表的底层其实就是一个数组,数据的是连续存储的(顺序表物理结构连续);而链表它每一个数据都不是连续的(链表物理结构上不一定连续)。链表节点通过观察上图,我们会发现链表每一个节点都存放在数据和下一个节点的地址。
2024-07-05 18:14:21
1822
11
原创 顺序表实现--通讯录
不过这里需要注意的时:我们是基于顺序表来实现通讯录,我们需要通讯录的头文件,也需要用到顺序表的相关代码,两个头文件在使用时都会用到另一个头文件的东西,而头文件又不能相互包含,(这里在通讯录头文件Contact.h中只需声明顺序表结构体就可以了(不可以直接使用重命名后的结构体名)),顺序表实现的头文件直接包含Contact.h即可(因为会涉及到数据类型重命名和插入、查找数据等)。中,实现顺序表时,存储的是整形数据,那现在需要将用户信息存储起来,我们就让顺序表存储的数据是我们结构体(联系人信息)。
2024-07-02 16:30:52
1112
9
原创 【数据结构】——顺序表
当我们想要使⽤大量使⽤同⼀类型的数据时,通过⼿动定义⼤量的独立的变量对于程序来说,可读性非常差,我们可以借助数组这样的数据结构将⼤量的数据组织在⼀起,结构也可以理解为组织数据的方式。在使用完顺序表后,就要销毁顺序表,因为动态顺序表内存是动态开辟的,所以需要对动态内存进行释放,并将有效数据和空间容量个数置为0;到这里,顺序表的知识就完成了,学完这些,我们也要写顺序表的实践,就是通讯录——在下一篇进行实现。求数组的长度,求数组的有效数据个数,向下标为数据有效个数的位置插入数据(注意:这里是。
2024-06-30 22:11:50
5347
17
原创 预处理详解
基本语法(使用方法)看几个例子:1、int main()return 0;这里会输出100,在预处理的过程中,会将代码中的MAX 替换成 100这里如果是这样int main()return 0;这里输出结果是7,而不是10这是因为预处理将N替换成了2+3,而不是替换成5;当然#define 还可以定义关键字或者符号等2、casecaseint main()int n = 0;CASE 1:;CASE 2:;
2024-06-26 23:15:27
645
2
原创 编译——链接
在ANSI C的任何一种实现中,存在两个不同的环境:第一种就是编译环境,在这个环境中源代码被转换成可执行的机器指令(二进制指令)第二种是执行环境,它用于实现执行代码。
2024-06-22 19:54:24
715
1
原创 文件操作——C语言
文件指的就是磁盘(硬盘)上的文件在程序设计中,文件一般有两种,分别是:程序文件、数据文件。程序文件:程序文件包括源程序文件(后缀为.c),目标文件(在windows环境下后缀是 .abj),可执行程序(windows环境下后缀是 .exe)数据文件:文件的内容不一定是程序,而是程序运行时读写的数据,比如程序运行需要从中读取数据的文件,或者输出内容的文件。本篇内容主要学习数据文件相关的内容。
2024-06-18 20:30:09
986
2
原创 C语言——自定义类型
在之前的学习中,我们学习过数组,数组用来存放一些相同类型的变量;那如果我们需要存储不同类型的数据,数组就无法满足我们的需求,所以,现在就来学习一下能够存放不同类型的变量--自定义类型。
2024-06-15 22:35:25
807
原创 数据在内存中的存储
自从学习指针开始,内存这一个概念就经常使用,之前,只考虑数据存储的地址,却没有想过数据到底是怎样存储到内存当中的,又是如何被读取来应用的?本篇就来学习,理解数据在内存中到底是如何去存储的。
2024-06-13 00:39:13
1018
1
原创 C语言字符(串)函数
一键三连加关注在我们写代码的过程中呢,经常会遇到一些处理字符和字符串的问题,比如将大小写字母的转换,计算字符串长度等,为了方便操作这些字符和字符串,C语言标准库提供了一些库函数,接下来就学习一下这些字符和字符串函数。
2024-06-06 17:05:46
1040
原创 学习——理解指针(4)(指针学习最后一节)
在之前操作符学习时,学习了sizeof操作符,sizeof计算变量所占内存空间的大小,单位是字节,(操作数也可以是类型,计算的是类型创建的变量所占空间的大小)。sizeof只关注占用内存空间的大小,并不在乎存放什么数据。
2024-06-01 17:28:10
305
原创 学习——理解指针(3)
通过之前的学习,我们了解了指针,int*是整型指针,指向的是整型;那么,指向字符型的指针就是字符指针,即char*除了上述代码,还可以这样应用看上述代码,是把"hello world"这个字符串放在pstr里了吗?其实不然,这里只是把这个字符串首字符的地址存放到了指针pstr里。看到这里可能会感到疑惑str1和str2都是数组名,代表首元素的地,址不都是存放'h'的地址吗,怎么不一样呢?这里需要注意,str1与str2是两个不同的数组,虽然存放的内容是一样的,但是在内存中的存放的位置是不一样的。
2024-05-31 14:25:12
730
1
原创 学习——理解指针(1)
其实,这样写代码只是将a与b的数值传给了函数swap1的形参,而在函数运行时,会创建两个临时变量x,y用来接收a,b的值,而函数也只是将x,y两个的值交换了,并没有把a和b进行交换;举个例子,一栋大楼中有许多个房间,如果想要快速的找到一个房间,就需要知道这个 房间的门牌号,这个门牌号就可以理解成这个房间的地址;我们知道,指针变量存放的是地址,地址又有所指向的值,所以用const修饰指针变量,是指针变量不可被修改,还是指针所指向的值不可被修改呢?有了a的地址,现在需要把地址存起来,这时候就用到了指针变量;
2024-05-26 17:06:54
811
原创 实践 : 简单扫雷游戏
扫雷游戏,我们需要在9*9(或者更多)的棋盘上去布置雷和派擦汗雷,所布置的雷与排查雷的信息都需要进行记录,所以用两个二维数组来记录这些信息;用show数组来记录所排查的雷的信息,刚开始,用‘*’来展示,由于会排查边缘是否为雷,并统计周围8个位置雷的信息,所以就把数组大小设置成11*11;根据图析,可以看出周围8个坐标的规律,因为‘1’代表雷,‘0’不是雷;布置雷其实就是生成一个或多个随机的坐标,将这些坐标的位置布置成雷,用代码实现就是将mine这个数组数组中生产随机坐标处的值改为‘1’;
2024-05-23 17:08:59
957
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人