- 博客(39)
- 收藏
- 关注
原创 【数据结构】——栈和队列OJ
题目的要求很简单,就是要求我们判断其输入的括号字符串是否是有效的括号,那么我们要如何判断呢?我们可以这样,我们遍历出传入的字符串,然后我们创建一个栈,然后如果这个字符是组左括号,那么我们就让其入栈,然后如果是右括号,那么我们就取栈顶的元素和这个右括号进行对比,如果匹配那么就出栈,不匹配的话那么就说明这个字符串不是有效的括号,然后继续进行比较,直到字符串遍历完,那么我们字符串遍历完后,是否就表示我们的这个括号是有效的呢?
2025-05-13 23:53:36
6510
18
原创 【数据结构】——队列
概念:只允许在⼀端进⾏插⼊数据操作,在另⼀端进⾏删除数据操作的特殊线性表,队列具有先进先 出FIFO(First In First Out)。
2025-05-12 22:21:00
5850
11
原创 【数据结构】——栈
栈其实就是一种特殊的顺序表,其只允许在一端进出,就是栈的数据的插入和删除只能在一端进行,进行数据的插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的元素遵循先进后出LIFO(Last InFirst Out)的原则。栈的插入操作叫做进栈/压栈/入栈,入栈的位置也是在栈顶。栈的删除操作叫做出栈。出栈也是在栈顶。那么我们的栈是要如何进行实现呢?我们实现栈的话有两种:链表和数组。
2025-05-10 23:12:27
5691
6
原创 【数据结构】——双向链表
我们前面学习了单链表,其是我们链表中的其中一种,我们前面的单链表其实全称是单向无头不循环链表,我们的链表从三个维度进行分类,一共分为八种。1、单向和双向可以看到第一个链表,其只能找到其后一个节点,是没办法找到其前面的节点的,其遍历只能从左往右遍历。而我们的双向链表,其节点中,有三个元素,一比我们单向的多了一个,其就多了一共指向前一共节点的指针,我们的双向链表是可以寻找到前一个节点的,其是可以从左往右遍历,也可以从右往左边进行遍历。2、带头或不带头。
2025-05-09 01:28:58
6052
10
原创 【数据结构】——单链表练习(1)
那么根据题目的要求我们大致明白这道题要做什么,就是将一个链表中,和指定的值相等的元素的节点删除,然后返回删除后的新的链表,然后题目给我们传入的参数是链表的头节点和指定的元素。
2025-05-03 03:25:28
6235
18
原创 【初阶数据结构】——顺序表
在上面我们提到了动态顺序表,其有三个成员,第一个成员是一个指针,用来指向开辟的空间,然后第二个成员就是用来记录当前表中的有效元素的个数,第三个成员就表示当前表的容量。其定义如下:然后我们就使用我们的动态内存管理函数来开辟空间,如果忘记的可以往前复习一下,下面我们简单进行复习一下。malloc函数,其是可以申请一块连续的空间,返回的是这块空间的地址。calloc函数,其和上面的函数是一样的功能,就是其参数不一样,第一个参数是要开辟的元素个数,然后第二个参数是开辟的一个元素的大小。
2025-04-19 02:59:22
6199
3
原创 【初阶数据结构】——算法复杂度
数据结构(Data Structure)是计算机存储、组织数据的⽅式,指相互之间存在⼀种或多种特定关系的数 据元素的集合。没有⼀种单⼀的数据结构对所有⽤途都有⽤,所以我们要学各式各样的数据结构, 如:线性表、树、图、哈希等下面我们就要踏上学习数据结构的旅程了,我们这部分主要是通过C语言来学习初阶数据结构,后续我们学习C++的时候,就会继续高阶数据结构和算法。算法(Algorithm):就是定义良好的计算过程,他取⼀个或⼀组的值为输⼊,并产⽣出⼀个或⼀组值作为 输出。
2025-04-15 23:28:44
6064
4
原创 【C语言】预处理(下)(C语言完结篇)
在编译一个程序的时候,如果我们要将一条语句,编译或者放弃编译,那么我们可以使用条件编译,比如调试性的代码,我们在调试完后,将其删去又会很浪费,但是保留又会很难看,影响我们代码的可读性,那么我们就可以使用条件编译,在编译的时候不编译这些调试性代码。例如我们在开头使用了#define定义一个符号,如果我们没有注释或者删除这个符号,那么我们是可以编译里面的调试性代码的,反之就不可以编译。但是这个是不会影响代码的正常运行的。
2025-04-12 16:37:55
971
4
原创 【C语言】预处理(预编译)(C语言完结篇)
这个关键字我们在前面的学习也已经遇到过了,下面我们来详细学习。其定义常量的语法如下:那么M就是我们定义的常量的名字,100是我们定义的常量的值。我们可以使用#define来定义各种类型的常量,我们使用其定义常量,对于常量的名字有个约定,就是对名字最好使用全部大写。这个定义常量,其本质上是替换,其在预处理后,会将程序中的M替换成100。所以我们使用#define定义常量的时候,末尾不要加分号,因为其会将这个分号也当成常量替换进我们的程序。如下:可以看到此时的编译器已经报错了。
2025-04-10 23:00:43
989
4
原创 【C语言】编译和链接
在ANSI C的任何一种实现中,存在着两个不同的环境:1、翻译环境:在翻译环境中,其会通过编译和链接两个大的步骤,其中编译又分为了预处理(这 个我们后面还会详细讲解),编译和汇编,然后将源代码转换为可执行的机器指令(二进制指 令),然后生成可执行文件。2、运行环境:就是执行环境,在运行环境中会执行可执行程序,然后输出结果。下面我们将在翻译环境和运行环境下具体是干啥的。
2025-04-07 20:00:14
1331
8
原创 【C语言】文件操作(2)
在前面我们学习了文件的顺序读写的函数,那么当我们要读取某个指定位置的内容的时候,是否只能顺序的读取到这个内容?还有在对文件进行输入的时候,需要对指定的位置进行写入,那么此时应该怎么办呢?我们也可以使用函数来更改读写的位置的,从而实现随机读写。
2025-03-31 20:41:05
1080
5
原创 【C语言】文件操作
我们在电脑中的数据都是存储在电脑的内存中的,但是当我们关机,程序退出等,那么此时内存就会回收,那么数据就没了,那么等我们再次开机,运行程序的时候,就没办法再找到这个程序的,那么我们需要将这个数据可以一直保存着,那么我们可以使用文件,将数据进行保存。文件是存储在计算机上的信息集合,其可以分为很多种,比如:文本文档、图片、程序等程序文件包括了:源文件程序(后缀为.c),目标文件(windows环境下后缀名为.odj),可执行文件(windows环境下后缀名为.exe)。文件的内容是程序运行中读写的数据。
2025-03-31 11:25:33
1258
3
原创 【C语言】动态内存管理
C/C++程序内存分配的⼏个区域:1. 栈区(stack):在执⾏函数时,函数内局部变量的存储单元都可以在栈上创建,函数执⾏结束时 这些存储单元⾃动被释放。栈内存分配运算内置于处理器的指令集中,效率很⾼,但是分配的内 存容量有限。栈区主要存放运⾏函数⽽分配的局部变量、函数参数、返回数据、返回地址等。《函数栈帧的创建和销毁》2. 堆区(heap):⼀般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。分配⽅ 式类似于链表。3. 数据段(静态区):(static)存放全局变量、静态数据。
2025-03-24 20:33:23
989
6
原创 【C语言】自定义数据类型:联合体和枚举
和结构体一样,联合体也是由一个或者多个成员组成,这些成员可以是不同的类型。联合体和结构体的不同的就是,其所有成员共用一块内存空间,所以联合体也称为共用体,那么因为其是所有成员共用一块内存空间,所以其空间大小应该是最大的成员,而且当我们对其中一个成员赋值的时候,其他成员的值也会发生变化。下面我们开始对联合体进行学习。
2025-03-23 18:15:43
580
1
原创 【C语言】使用结构体实现位段
前面我们学习了结构体,位段的声明和结构体是一样的,其区别如下:1、位段的成员必须是int 、unsigned int 、signed int 、在C99中位段的成员的类型也可以选择其他类型。2、位段的成员名后边有一个冒号和一个数字如下:那么这几个变量后面的数字表示啥意思呢?会不会是表示其二进制的位数呢?我们继续往下分析。
2025-03-20 22:57:43
880
2
原创 【C语言】自定义类型:结构体
我们前面学习操作符的时候已经接触过结构体了,下面我们回顾一下结构体的基本内容。创建结构体的语法如上所示:struct是创建结构体的关键字,然后tag就是我们结构体的名称,member-list是结构体的成员列表,列表包含了对结构体进行描述的变量,variable-list是创建结构体时需要同时创建的结构体变量。下面我们通过一个例子来理解:例如我们现在需要描述一个学生,那么学生的描述就有姓名、年龄、学号、性别等。那么此时单个变量的描述就没办法完整描述了。
2025-03-18 23:07:19
1051
5
原创 [C语言]数据在内存中的存储
在讲解操作符的时候,我们就讲过了下⾯的内容:整数的2进制表⽰⽅法有三种,即原码、反码和补码。有符号的整数,三种表⽰⽅法均有符号位和数值位两部分,符号位都是⽤0表⽰“正”,⽤1表 ⽰“负”,最⾼位的⼀位是被当做符号位,剩余的都是数值位。正整数的原、反、补码都相同。负整数的三种表⽰⽅法各不相同。直接将数值按照正负数的形式翻译成⼆进制得到的就是原码。将原码的符号位不变,其他位依次按位取反就可以得到反码。反码+1就得到补码。
2025-03-16 20:55:56
803
1
原创 [C语言]内存函数的使用和模拟实现
前面我们学习了字符串函数,里面的strcpy函数和strncpy函数是实现拷贝字符串的功能,不同的是前者是将整个字符串拷贝,后者是可以指定拷贝的字符个数。但是我们的数据类型有多种,那么当我们需要拷贝的对象是其他的数据类型,这时候我们要咋办呢?那么有没有那么一种函数,可以实现对任何数据类型都可以实现拷贝功能的函数呢?有的兄弟,有的。我们接下来要学习的这个函数就是了。memcpy函数,它是对内存块的内容进行拷贝,无论内存存放的内容是什么类型,都可以通过内存来实现拷贝。
2025-03-12 23:14:59
1027
6
原创 字符和字符串函数(2)
看这个函数的名字和前面我们学习的一个函数很像,strcpy函数,那么其两者有啥联系吗?我们知道前者是将第二个参数的字符串拷贝到第一个参数的目标空间。而且其拷贝会将目标空间的内容给替换掉,那么我们只想拷贝一部分咋办?那么此时就学习带n的字符串函数,这个n就表示我们在拷贝的时候要拷贝的字符的数量。可以看到带n的函数比不带n的函数更加灵活,可以指定要操作的字符的数量。所以也叫带n的字符串函数为受限制函数,不带n的为不受限制的字符串函数。下面我们看看strncpy函数的原型:、
2025-03-10 21:05:07
798
4
原创 【c语言】字符函数和字符串函数(1)
c语言中有部分函数是专门做字符分类的,也就是一个字符是属于什么类型的字符,这些函 数的使用要包含一个头文件ctype.h中。其具体如下图所示:这些函数的使用方式都类似,下面我们通过一个函数来看其使用方式:islower函数是能够判断参数c是不是小写字母,如果参数c是小写字母那么就返回非0的整 数,如果不是小写字母就返回0。下面我们通过一个练习来学习:将字符串中小写的字母变成大写的字母。
2025-02-25 17:44:00
1230
7
原创 【c语言】指针 (完结)
前面我们在学习操作符的时候,我们学习了sizeof,知道其是计算变量所占内存的大小的,单 位是字节,如果操作数是数据类型的话,计算的就是这个类型的变量所占的内存空间的大小单 位也是字节。其计算的结果只与该变量的类型有关,与其存放的集体数据无关。还有就是对于要计算的是变量的大小,在语法的写法可以不写小括号,所以我们在阅读代码的 时候对于sizeof计算一个变量没有括号,这个写法也是可以的。
2025-01-13 23:40:41
1283
4
原创 【c语言】指针4(含qsort函数)
回调函数是什么呢?回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向 的函数时,被调用的函数就是回调函数。回调函数不是由该函数的实现方直接调用,而是在 特定的事件或者条件发生时,由另外一方调用的,用于对该事件或条件进行响应。
2024-12-14 00:37:43
784
3
原创 【c语言】指针3
前面我们学习了,指针数组,指针数组是一种数组,数组中存放的是地址(指针)那么数组指针是什么呢?是指针变量还是数组呢?其是指针变量。前面我们已经熟悉了:整型指针变量:存放的是整型变量的地址,能够指向整型数据的指针。浮点型指针变量:存放的是浮点型变量的地址,能够指向浮点型数据的指针。那么数组指针就应该是存放数组的地址的指针,能够指向数组的指针。那么数组指针的写法是咋样的呢?我们看下面两个写法:这里我们思考一下p1和p2都是数组指针吗?
2024-12-05 16:32:14
982
6
原创 【C语言】指针2
在上一章节我们在使用指针访问数组的内容的时候,我们有下面这样的代码在上述的代码中我们使用&arr[0]来取得数组首元素的地址,但是我们前面也说过,数组名字 其实也就是数组的地址,而且还是首元素的地址。那么是不是说&arr[ 0 ]=arr;呢?下面我们 通过测试看看。代码如下:输出结果:可以看到数组名和数组首元素地址打印出的结果是一模一样的,数组名就是首元素的地址, 那么如果数组名就是首元素地址那么有下面的代码,又该如何解释呢?
2024-11-27 01:11:18
1176
3
原创 【C语言】指针1
在学习内存和地址前,我们讲一个生活中的案例:我们在入学的时候都需要找到自己的宿舍,但是现在你所在的宿舍楼,有一百个房间,但是 每个房间都没有编号,而且每个宿舍都是一样的,只是在每个宿舍的门口贴了这个宿舍住的 人,那么我们要想找到我们是那个宿舍的是不是就只能一个一个找了,直到找到为止。这样 的效率就很低了。但是如果我们给每个宿舍都给上编号,然后和你说你的宿舍是那个编号那 么就不用一个一个找了。
2024-11-24 23:30:52
1176
4
原创 【C语言】操作符2(含操作符的应用)
定义:结构体的定义有两种方法:1、在创建结构体的时候在最后直接写出这个变量,注意后面的分号!!!2、和定义结构体有一点类似,使用struct关键字然后加上一个名字,然后再加上这个变量的 名字。初始化:结构体的初始化和数组差不多,也是使用大括号。第一个初始化就会按照结构体中的数据顺序的初始化,即第一个"zhangsan"就是name的,然 后20就是age的了,第二种就是指定初始化,这个就在要初始化的那个数据加.即可。
2024-11-19 23:11:11
1271
2
原创 【C语言】操作符1
上面的操作符有部分我们在前面的学习中已经见到和使用过了,如:算术操作符,赋值操作 符,单目操作符,关系操作符,逻辑操作符,条件操作符等。今天我们继续学习一部分,操作 符中有一些操作符和二进制有关系,我们先对进制和进制转换学习一下。
2024-11-17 16:10:54
1464
2
原创 【C语言】函数递归
其实我们在前面的学习中已经使用过函数的递归了。那么什么是递归呢递归是一种解决问题的方法,就是函数自己调用自己,例如下面的函数。上面就是一个简单的函数递归,在main函数内调用自己。
2024-11-13 18:32:49
1358
2
原创 用c语言写一个简易版的扫雷游戏
1.1:基本功能1、使用控制台实现经典的扫雷游戏2、游戏可以通过菜单实现继续玩或者退出游戏3、扫雷游戏的棋盘是9*9的格子4、随机布置10个雷5、可以排查雷(1)、如果位置不是雷,就显示周围有几个雷(2)、如果是雷,就炸死游戏结束(3)、 把除10个雷之外的所有非雷都找出来,则排雷成功,游戏结束1.2:游戏分析和设计1.2.1:数据结构分析扫雷过程中,布置雷和排查雷都是需要存储的,所以我们需要一定的数据结构来存储这些 信息。
2024-11-08 02:42:19
1545
2
原创 函数(C语言)
3. 1:函数的语法形式ret_type fun_name(形式参数){}ret_type:是函数返回类型fun_name:是函数名括号里面是形式参数{}里面的是函数体我们可以把函数当成一个加工厂,工厂输入原材料,经过工厂加工才能生产出产品,那 函数也是一样,函数一般会输入一些值(可以是0个,也可以是多个),经过函数内的计 算,得出结果。
2024-11-06 14:46:31
1133
2
原创 c语言:一维数组+二维数组+二分查找法
1:定义数组的基本语法为存放数据的类型 数组名[常量];如创建一个整型数组:int arr[10];arr为数组名,10代表 这个数组的长度。2:数组的初始化有时候,数组在创建的时候,我们需要给定⼀些初始值,这种就称为初始化的。那数组如何初始化呢?数组的初始化⼀般使⽤⼤括号,将数据放在⼤括号中。如下:3:数组的类型数组的类型并不是存放的数据的类型,去掉数组名字那就是数组的类型了。
2024-11-02 14:59:28
1153
1
原创 使用C语言写一个猜数字游戏
1.电脑生成1~100的随机数2.玩家猜数字,根据玩家输入的数字和产生的随机数的进行比较大了就反馈大了小了就反馈小 了,当两个数相等时候就反馈猜对了,且游戏结束。
2024-10-31 21:59:13
1994
2
原创 C语言中的分支语句
C语言是结构化的程序设计语言,这里的结构指的是,可以发现现实中很多问题都可以化解为这三种结构我们可以使用if、switch实现选择结构,for、whlie、do whlie实现循环。
2024-10-28 14:23:01
923
2
原创 C语言数据类型和变量
我们在生活中会遇到各种各样的数据。同样c语言中也提供了丰富的数据类型来描述这些数据。如:整型来表示整数,字符型来表示字符,浮点型(float或double)来表示小 数。下图为c语言中的数据类型本次对内置类型进行学习1.1:字符型char:可以用来表示一些字符如:'@'、'a'、'b'等等[signed] char 表示有符号的unsigned char 表示无符号的其中有无符号是有无+-号1.2:整型int:表示整型。
2024-10-25 13:47:00
1939
3
原创 c语言常见概念
C语⾔字符串中⼀个特殊的知识,就是在字符串的末尾隐藏放着⼀个 \0 字符,这个 \0 字符是字符串 的结束标志。main函数是程序执行的入口,不管代码有多少,代码的执行都是从main函数开始执行,而且 一 个有且只能有一个,所以main称为主函数。使⽤双引号括起来的⼀串字符就被称为字符串,如:"abcdef",就是⼀个 字符串。市面上的开发工具五花八门,比较推荐的是vs2022,下载简单,不需要去搭建环境,对新手比较友好,就是安装包有点大。
2024-10-23 13:29:59
1180
8
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人