【3.1】栈和队列
前言栈和队列是线性表的另一种变形,它拥有一些各自的特点。
如下所有代码需要做如下引用:
123456#include <stdio.h>#include <stdbool.h>#include <malloc.h>//如果你使用的是Visual Studio,则还需要添加如下一条引用#define _CRT_SECURE_NO_WARNINGS
关于上述引用的说明,原因参考关于C语言的一些零碎思考
栈栈的基本概念栈的定义栈(Stack)本质来说还是一种线性表,栈是只允许在一端进行插入或者删除操作的线性表。
空栈:栈中不存储任何数据
栈顶:栈的最顶端
栈底:栈的最低端
栈的特点:后进先出(Last In First Out,LIFO)
栈的基本操作
操作
说明
InitStack()
初始化栈。创造一个空栈,分配内存空间
DestoryStack()
销毁栈。销毁并释放栈所占的内存空间
Push()
进栈。如果栈未满,则将新元素压入栈顶
Pop()
出栈。如果栈不是空栈,则将栈顶元素弹出栈
GetTop()
读取 ...
【4.1】串
前言由于计算机的发展,人们发现对于非数值类型的处理越来越多,进而衍生出来串。
串也就是我们所使用的字符串。
如下所有代码需要做如下引用:
123456#include <stdio.h>#include <stdbool.h>#include <string.h>//如果你使用的是Visual Studio,则还需要添加如下一条引用#define _CRT_SECURE_NO_WARNINGS
关于上述引用的说明,原因参考关于C语言的一些零碎思考
串的定义和基本操作串的定义串,即字符串(String)是由零个或者多个字符组成的有限序列,一般记作S='a1,a2,...an'($n \geqslant 0 $)。
其中S是串的名称,单引号括起来的字符序列是串的值,其中串字符的个数称为串的长度。当 $n =0$ 的时候称为空串。代码示例:
1S = "Hello,World"
子串:串中任意连续个字符组成的子序列,例如:上面的子串Hello。
串的数据对象限定为:字符集(如中文字符,英文字符)。
串的 ...
【5.1】树与二叉树
前言树的基本概念树的定义树是一种数据结构,它和我们现实生活中的树非常类似,其存在一个根节点,向下分裂,产生分支节点,如此,形成了如下图所示的“树”:
图片来源王道《数据结构》
当然,存在一种特殊的树——空树,也就是结点树为 0 的树。
非空树的特性:
有且仅有一个根节点
没有后继的结点称为“叶子结点”(终端结点)
有后继的结点称为“分支节点”(非终端结点)
结点之间的关系描述
祖先结点:在当前指定结点前驱到根节点路径上的所有结点(即上层)
子孙结点:指定结点下面的所有结点
双亲结点:指定结点的前驱结点
孩子结点:指定结点的直接后继
兄弟结点:指定结点同一层且同一个前驱的结点
堂兄弟结点:指定结点同一层且不是同一个前驱的结点
结点之间的路径:根结点到指定结点(只能从上往下)
路径长度:指的经过了几条边(只能从上往下)
结点,树的属性描述
结点的层次(深度):从上往下数
结点的高度:从下往上数
树的高度(深度):总共多少层
结点的度:结点有几个分支
树的度:各结点的度的最大值
树的分类
有序树:逻辑上树中的结点的各子树从左到右是有次序的,不能互换。
无序树:逻辑上树中的结点 ...
【1.1】数据结构与算法
前言算法是什么?我们如何来评估算法的好坏?有没有一种优美的数学方式来评估算法好坏,而不受客观环境的影响。例如计算机的性能影响?
学习此部分,需要掌握一定的C语言基础
本部分内容参考程杰老师《大话数据结构》,青岛大学王卓老师的授课等 综合个人所学的总结笔记
本篇写于 时间 ,部分内容可能与现在不符,请自行判断
——这一招是我从我最爱的游戏里学来的♬
算法的定义算法是解决特定问题求解步骤的描述,在计算机中表示为指令的有限序列并且每条指令表示一个或者多个操作算法通俗理解就是对于问题的特定解决步骤。
算法的特性
输入输出算法具有零个或者多个输入,至少有一个输出。
有穷性算法在有限的步骤之后,能够自动结束而非无限循环。
确定性算法的每一个步骤都具有确定的含义,不会存在二义性。
可行性算法的每一个步骤都必须是可行的,也就是说每一步,都能执行有限次数完成。
算法设计要求
正确性算法的正确性是指算法至少应该具有输入,输出和加工处理无歧义性,能正确的反映问题的需求,能够得到问题的正确答案。
可读性算法设计的另一目的是为了便于阅读,理解和交流
健壮性当输入的数据不合法时,算法也可以对其做出相应处 ...
【2.1】线性表的逻辑结构
前言有了前面的基础,现在开始正式学习数据结构最常用也是最简单的一种结构——线性表。
学习本文需要掌握一定的 C语言基础。
本部分内容参考程杰老师《大话数据结构》,青岛大学王卓老师的授课,王道考研公开课等 综合个人所学的总结笔记。
线性表的定义线性表,顾名思义,是具有像线一样串联起来的表。串联则意味着存在一个头部,一个尾部,且中间的每个元素都是一个挨着一个,这样的表就可以称为线性表。
线性表(List):零个或多个数据元素的有限序列。
需要强调的是:
首先它是一个序列,也就是说,元素之间是有顺序的,如果元素存在多个,那么第一个元素无前驱,最后一个元素无后继,其他的元素都有且只有一个前驱和后继。
其次,线性表是有限的。事实上,计算机中处理的对象都是有限,无限的序列,只存于数学中的概念。
如果使用数学语言来进行定义的话,如下:
若将线性表记为($a_1,·····,a_{i-1},a_i,a_{i+1},···,a_n$),则表中 $a_{i-1}$ 领先于 $a_i$ ,$a_i$ 领先于 $a_{i+1}$,称 $a_{i-1}$ 是 $a_i$ 的直接前驱,$a_{i+1}$ 是 ...
【2.2】线性表的物理结构
前言在前面介绍了线性表是什么,现在来讲述线性表的两种物理结构的第一种——顺序存储结构。
学习本文需要掌握一定的 C语言基础。
本部分内容参考程杰老师《大话数据结构》,青岛大学王卓老师的授课,王道考研公开课等 综合个人所学的总结笔记。
线性表的顺序存储结构顺序表——用顺序存储的方式实现的线性表
顺序存储定义线性表的顺序存储结构,指的是用一段地址连续的存储单元依次存储线性表的数据元素。
线性表的顺序存储示意图如下:
可以通过sizeof(ElemType)函数来获取数据元素的大小
顺序表的特点是表中元素的逻辑顺序与其物理顺序相同。
顺序表上的基本操作的实现静态分配静态分配,顾名思义,它的分配空间在一开始定义的时候就是固定的,代码示例:
123456#define MaxSize 10 //链表默认空间大小typedef struct{ ElemType data[MaxSize]; //静态空间大小 int length; //链表的长度}SqList; //链表结构体
ElemType需要看你具体使用的数据结构的类型
此处 ...
【1.0】C-引言
【1.0】引言前言这是C语言基础的笔记,也是我的复习笔记,本笔记没有长篇大论的理论,也没有过多的基础解释,对于稍微熟悉一点计算机语言的但是又迫切复习的小伙伴来说可能会有一些帮助。
前排提醒,本文需要一定的计算机基础和计算机语言基础
废话不多说,直接开始C语言之旅。
C语言入门程序结构直接展示计算机语言的入门编程,Hello world,代码示例:
123456#include <stdio.h>int main(){ printf("Hello World"); //输出Hello World getchar(); //暂停控制台 return 0; //返回 0}
整段代码结构很简单,先来剖析一下每一个部分是什么意思。
第一行代码 #include <stdio.h> ,是C语言的头函数,#后面是预处理函数宏,这句话的意思是引入stdio.h 这个系统文件,在头文件中包含了C语言开始的入口和基本的处理,所以需要编写C语言,开头一定需要引入头函数。
第二行 int main() ...
【2.0】C-数据类型及运算
【2.0】数据类型及运算前言c 语言经典的入门内容,笔记断断续续写了一个多礼拜,最近一直在考试,碰到考试周了就很头疼。
标识符和关键字C程序由C语言的基本字符组成,基本字符依据规则组成C语言的标识符和关键词,再按照语法要求构成程序。
标识符C语言中由用户命名的符号称为标识符,用来标明用户设定的变量名,数组名,函数名,结构体名等。标识符必须由有效字符构成,也就是标识符要合法。
C语言的命名规则如下:
标识符只能由字母,下划线,数字组成,且第一个字符必须是字母或者下划线,不能是数字。如:cla,cla1都是合法的,但是2cla,%123等都是不合法的。
字母区分大小写,例如:AB 和 ab是两个不同的标识符
当然有的计算机语言不区分大小写;例如:VB语言不区分大小写
不能使用C语言中的关键字
C语言虽然本身不限制标识符的长度,但是实际长度收到不同的编译系统和机器系统的限制。
为了提高标识符的可读性,一般来说,业内较为流行的有驼峰命名法,下划线命名法和匈牙利命名法
驼峰命名法
小驼峰命名法:除了第一个单词之外,其他单词首字母都大学。例如:myFileName,openFil ...
【2.0】访问寄存器和内存
前言这部分集中在寄存器和内存的角度来访问和使用,CPU 和内存以及寄存器的交互命令。
寄存器一个典型的 CPU 是由运算器,控制器,寄存器等器件构成的,这些器件由内部总线相连。
对于汇编程序员来说,CPU 中的主要部件就是寄存器。寄存器是 CPU 中程序员可以用指令读写的部件。程序员通过改变寄存器中的内容来实现对 CPU 的控制。
不同的 CPU ,寄存器的个数,结构是不相同的。8086 CPU有14个寄存器,每个寄存器都有一个名称,分别是:
通用寄存器:AX,BX,CX,DX
变址寄存器:SI,DI
指令寄存器:SP,BP
指令指针寄存器:IP
段寄存器:CS,SS,DS,ES
标志寄存器:PSW
其中 8086 所有寄存器都是 16 位的,这就意味着都可以存储两个字节的数据。
通用寄存器以AX为例,一个 16 位的寄存器存储一个 16 位的数据最大值是 $2^{16}-1$ 。
因为 8086 上一代 CPU 中的寄存器都是 8位 的,这样就会存在 8位的程序没有办法运行在 16位的 8086上,为了解决兼容性的问题,**8086给出的解决方案就是将通用寄存器分为两个独 ...
【1.0】基础知识
前言本部分汇编内容是基于 8086 的架构,内容来源学习自王爽老师的《汇编语言》,你可以在 B站或者其他平台查找到相关视频内容,例如:通俗易懂的汇编语言(王爽老师的书)。
汇编系列内容仅作为本人学习记录用途,请自行参考
机器语言众所周知,计算机最开始也是最底层就是二进制的 0 和 1,早期的程序员就是在一堆 0 和 1 中编程。
使用 0 和 1 的机器语言不仅抽象,而且出错不易查找错误,增加了复杂性和难度。
汇编语言的产生早期的程序员为了解决直接使用机器语言所带来的问题,于是产生了汇编语言。
汇编语言的主体是汇编指令,汇编指令和机器指令的差别在于指令的表示方法上,汇编指令更加便于记忆和理解书写的格式。
例如:机器指令 1000100111011000 表示将寄存器 BX 的内容送到 AX 中。汇编指令则写成 mov ax,bx。这种写法更加符合人类的语言和逻辑。
于是,程序员就使用汇编编写程序,然后通过编译器将汇编语言写出的源程序编译成机器码,最终计算机执行指令。
图片来源:王爽老师的《汇编语言》
计算机中的总线在计算机中专门连接 CPU 和其他芯片的导线就是总线,从物理 ...