数据结构中的堆栈:
堆可以看成一棵按顺序排列的完全二叉树,根节点可以为大于等于任何子节点(也可以小于等于任意子节点,看具体的排序方法),在存取时没有任何限制,可以随意的访问某一个子节点。
栈或者称为堆栈(stack),可以看成是一些堆起来的盘子,桶状线性数据结构。但是栈是受限制的线性数据结构,只允许先进后出,并且只能在栈顶进行插入删除操作。
内存区的堆栈:
首先了解下内存区:堆区存放程序员申请的动态内存,栈区存放系统分配内存的局部变量,静态区存放全局变量和静态变量,只读区存放常量(常量比如函数中使用的字符串“123”)和程序代码。(还有没列出的分区)
堆是由程序员主动申请的动态内存,其内存大小灵活可操控,处于高地址区域,地址的增长方向是向上的,堆的地址空间是不连续的。c程序中有malloc来动态分配内存,对象化编程语言中有new 来实例化对象,这个对象相关的数据也存储在堆中。
栈是由系统自动分配的地址,栈的地址位于低地址区域,增长方向向下,栈的地址空间是连续的。栈的总体地址空间有限,通常不会太大(可能为2M),栈存放的是方法内的局部变量。
内存区堆栈的区别:
堆由程序员申请动态分配,内存灵活,可以很大,地址不连续,栈由系统自动分配,内存较小,地址连续。堆的生命周期比栈长,需要程序员主动释放或者有垃圾回收机制处理,栈的数据在函数运行过后就被释放。堆的响应速度比栈慢,更新速度比栈慢。
数据结构队列:
队列同样是受限制的线性数据结构,队列只允许在队尾进行插入操作,在队头进行删除操作。普通顺序队列的队满情况是rear-front=MAXSIZE,普通的顺序队列有假溢出的情况,因为只在队尾插入、队头删除,所以队头被删除的空间也不能存放新的数据。初始情况下rear=front=-1。
循环队列是头尾相接的队列,当队列插入时,rear+1,当队列删除时,front+1。循环队列的队满与队空都有rear=front。为了便于区分队空还是队满可以用一个变量num来计数,还可以空置rear和front之间的一个空间。
数据结构树
结点的度:结点的子树的数目
叶子结点:度为0(没有子树)的结点
分支结点:度不为0的结点,子树不为0
树的深度:树结点的最大层数
树的度:各节点的度的最大值,例如某一结点有3个子树是,其余结点都小于或者等于3个子树,则此树的度为3,称为三叉树
森林:m课互不相交的树的集合
非空二叉树第i层上最多有2^(i-1)个结点 ,一颗深度为h的二叉树中,最多有2^h-1个结点
满二叉树,深度为h,则结点必有2^h-1个结点
完全二叉树按照从上至下,从左至右的顺序安排结点,不能出现本层中左边结点没满,右边出现结点的情况
哈夫曼树,构建具有最小带权路径长度的二叉树,最优二叉树(第一笔试回顾有提到哈夫曼树的构建)
数据结构图
图由顶点的集合V和顶点之间的关系集合R构成。
例如G1=(V,E)
V={V1,V2,V3,V4,V5}
E={(v1,v2),(v1,v3)}
表示无向图中,结点v1和v2相连,v1和v3相连。其中与某结点相连的线段的数目称为该节点的度。
例如G2=(V,A)
V={V1,V2,V3,V4,V5}
A={<v1,v2>,<v1,v3>}
G2表示有向图中,v1和v2相连,v1和v3相连。
有向图在结点与结点之间有箭头的导向。其中某结点发出箭头线段的数量称为出度,接收到的箭头线段数量称为入度。
无向完全图:任意两结点间都有一条边直接相连的图。边的数目为:n*(n-1)/2。
有向完全图:任意两结点间都有相反方向的带箭头的弧(就是带箭头的线段,方向相反)连接。弧的数目为:n*(n-1)。
图的存储结构有邻接矩阵和邻接表
邻接矩阵根据图结点的个数 n 转换成 n 阶矩阵。两结点间有连线,则置值为1。
例如G1=(V,E)
V={V1,V2,V3,V4}
E={(v1,v2),(v1,v3)}
邻接矩阵为
v1 v2 v3 v3
v1 0 1 1 0
v2 1 0 0 0
v3 1 0 0 0
v4 0 0 0 0
邻接表为:v1—>v2—>v3
v2—>v1
v3—>v1
学习记录,以供后面再翻阅!以上,祝好!