3.1栈和队列
栈和队列的定义和特点:
栈是限定仅在表的一端进行插入和删除操作的线性表。
插入,删除的一端称为栈顶,另一端称为栈底。
不含任何元素的空表称为空栈。
栈是一种后进先出的线性表。
队列--先进先出
顺序栈的表示和实现:
附设top指针,指向栈顶元素。
另设base指针,指向栈底元素。
通常top指向栈顶元素之上的下标地址。
stacksize表示栈可使用的最大容量。
base==top是栈空标志。
链栈的表示和实现:
与链表的表示相同。
链栈是运算受限的单链表,只能在链表头部进行操作。
链栈中指针方向由栈顶指向栈底。
链表的头指针就是栈顶。
不需要头结点。
基本不存在栈满的情况。
空栈相当于头指针指向空。
插入和删除仅在栈顶处执行。
栈与递归:
递归的定义:若一个对象不分地包含它自己,或用自己给自己定义,则称这个对象是递归的。
若一个过程直接或间接的调用自己,则这个过程称为递归过程。
递归问题:用分治法求解
必备的三个条件:
1.能将一个问题转变为一个新问题,而新问题与原问题的解法相同或类同,不同的仅是处理的对象,且这些处理对象是有变化规律的。
2.可以通过上述转化使问题简化。
3.必须有一个明确的递归出口,或称递归的边界。
函数调用过程:
调用前,函数完成
1.将实惨返回地址等传递给被调用函数
2.为被调用函数的局部变量分配存储区
3.将控制转移到被调用函数的入口
调用后,系统完成:
1.保存被调用函数的计算结果
2.释放被调用函数的数据区
3.依照被调用函数保存的返回地址将控制转移到调用函数。
队列的顺序表示:
用一维数组base[maxqsize]
解决假上溢方法,引入循环队列--加入取余运算。
循环队列队空和队满:front==rear
解决方案:
1.另外设一个标志以区别队空队满
2.另设一个变量,记录元素个数
3.少用一个元素空间:
队空:front==rear
队满:(rear+1)%maxqsize==front
栈和队列:操作受限的线性表
串和数组:内容受限的线性表
串的定义:
零个或多个字符组成的有限序列。
串的术语:
1.子串:
一个串中任意个连续字符组成的子序列。
2.主串:
包含子串的串
3.字符位置:
字符在序列中的序号为该字符在串中的位置。
4.子串位置:
子串第一个字符在串中位置。
5.空格串:与空串不同
6.串相等:
长度相同,各个对应位置上的字符都相等。
串的模式匹配算法:
算法目的:
确定主串中所含子串(模式串)第一次出现的位置(定位)
算法种类:
BF算法:采用穷举法的思路
KMP算法
数组:按一定格式排列起来的,具有相同类型的数据元素的集合。
结论:线性表结构是数组结构的一个特例,而数组结构又是线性表结构的扩展
数组特点:
结构固定--定义后,维数和维界不再改变。
数组基本操作:
除了结构的初始化和销毁以外,只有取元素和修改元素的操作。
一般采用顺序存储结构来表示数组。
注意:
数组可以是多维的,但存储数据元素的内存单元地址是一维的,因此,在存储数组结构之前,需要解决将多维关系映射到一维关系的问题。
广义表的性质:
长度:定义为最外层所包含的元素个数。
深度:定义为该广义表展开后所包含括号重数。
原子深度为0,空表深度为1。
广义表可以为其他广义表共享。
广义表可以是一个递归的表。
广义表是多层次结构。
5.1树和二叉树
非线性结构:1:n或m:n
树形结构:
结点之间有分支
具有层次关系
树的定义:
树是n(n≥0)个结点的有限集
n=0称为空树。
树的定义是一个递归的定义。
1.有且仅有一个特定的称为根的结点
2.其余结点可以分为m(m>0)个互不相交的有限集,其中每个集合本身又是一棵树,并称为根的子树。
树的基本术语:
结点:包含一个数据以及若干指向子树根的分支。
根结点:非空树中无前趋结点的结点。
结点的度:拥有子树的个数。
树的度:树内各节点度的最大值。
树的深度:树中结点的最大层次。
路径:从某个结点到其子树中另一个结点的分支,构成两个结点之间的路径。
森林:是m(m≥0)棵互不相交的树的集合。
树一定是森林,森林不一定是树。
有序树,无序树:
二叉树:
结构最简单,规律性最强。
所有树都能转换为二叉树。
二叉树的性质:
1.在二叉树的第i层上至多有2^(i-1)个结点。
2.深度为k的二叉树最多有2^k-1个结点。(k≥1)
3.对任意一棵二叉树T,如果其叶子树为n0,度为2的结点数为n2,则n0=n2+1。
满二叉树和完全二叉树在顺序存储结构下可以复原。
二叉树的顺序存储:
按满二叉树的结点层次编号,依次存放二叉树中的数据元素。
适用于满二叉树和完全二叉树。
二叉树的链式存储:
一个结点包含三个域:数据域,左孩子指针域,右孩子指针域。
二叉树的遍历:
依次遍历二叉树中的三个组成部分:跟结点,左子树,右子树。
遍历前先判断树是否为空。
先序遍历:
中序遍历
后序遍历
折半查找:
设置low值和high值分别指向表头和表尾,mid值=(low+high)/2,key值大于mid值,low=mid+1,否则反之。
优点:时间复杂度为log2(n+1)
缺点:只能用于查找有序表,不适用于链表和无序表。
分块查找:索引表是按关键字值有序,子表内关键字不一定有序。
二叉排序树:中序遍历得到的结点是递增的
含有n个节点的二叉排序树的asl和树的形态有关。
二叉排序树的插入:与根节点值比较,小于根节点插入到左孩子,大于插入到右孩子。
二叉排序树的删除:
1.删除的是叶子结点,直接删除
2.删除的结点只有左孩子或右孩子,直接替换
3.删除的结点只有左孩子或右孩子,可以以中序前驱替换,再删除等值结点,也可以用中序后继替换。
平衡二叉树:
左子树与右子树的高度之差的绝对值≤1
左右子树也是平衡二叉排序树
平衡因子=节点左子树高度-节点右子树的高度
所有平衡因子的值只能是1,0,-1