数据结构-学习总结一

1.思维导图

2.学习笔记

线性表

1.概念:最简单,最常用的线性结构。
2.线性表的顺序存储结构

特点:逻辑上相邻,物理地址相邻。
     实现随机存储

3.线性表的链式结构

节点=数据元素+指针
数据元素:存放数据
指针:存放该节点的下一个元素的存储位置

4.头插法

void CreateListF(LikList*& L, ElemType a[], int n)
{
	LinkList* s;
	int i;
	L = new LNode;
	L->next = NULL;//创建头节点,其next域设为NULL
	for (i = 0; i < n; i++) {//循环建立数据节点
		s = new LNode;
		s->data = a[i];//创建数据节点*s
		s->next = L->next;//将*s插在原开始节点之前,头节点之后
		L->next = s;
	}
}

思路:生成一个空链表,不断的将新节点插入链表表头,链表的节点顺序与逻辑次序相反。
5.尾插法

void CreateListR(LinkList*& L, Elemtype a[], int n)
{
	LinkList* s, * r;
	int i;
	L = new LNode;//创建头节点
	r = L;//r始终指向尾节点,开始时指向头节点
	for (i = 0; i < n; i++) {//循环建立数据节点
		s = new LNode;
		s->data = a[i];//创建数据节点*s
		r->next = s;//将*s插入*r之后
		r = s;
	}
	r->next = NULL;//尾节点next域设置为NULL
}

思路:将新节点始终插入链表表尾,需要一个尾指针r。链表的节点顺序与逻辑次序相同

栈(后进先出)

只能在一段进行插入,删除的线性表。
1.按存储形式分为:顺序栈,链栈。
2.顺序栈

1.初始化栈:栈顶元素为-1;s->top=-1。
2.判断栈是否为空:判断栈顶指针是否为-1。
3.进栈:元素进栈前要判断栈顶是否满。
4.出栈:先确定栈不为空。
5.取栈:先确定栈不为空。
*顺序栈四要素:
栈空条件:s->toop=-1;
栈满条件:s->top=MaxSize=-1;
进栈操作:s->top++;
出栈操作:s->top--;

3.链栈

1.栈的链式存储结构是单链表,包含指向下一个节点的指针域,数据域。
2.判断栈是否为空,只需要判断头节点next的值是否为空。
3.出栈:需先判断栈是否为空。
4.取栈:需先判断栈是否为空。
*链栈四要素:
栈空条件:s->next=NULL;
栈满条件:无需考虑;
进栈操作:将新数据节点插到头节点后;
出栈操作:取出头节点之后的节点数据域并删除;

队列(先进先出)

只能在一段进行插入,另一端进行删除的线性表
1.按存储结构分为:顺序队列,链队列。
2.顺序队列

1.由一块连续的存储区域,和两个分别指向队头,队尾位置的变量组成。
2.队空:front=rear
3.队满:(rear+1)%MaxSize=front
4.入队:rear=(rear+1)%MaxSize
5.出队:front=(front+1)%MaxSize

3.链队

1.单链表,由存储队列元素的数据节点,指向队头队尾指针的链队节点。
2.队空:q->rear=NULL
3.入队:将新的数据节点插到单链表表尾
3.出队:删除单链表的第一个数据节点

1.由零个或多个字符组成的有序序列,操作对象是串的整体,串仅处理字符类型
2.串模式的匹配算法
a.BF算法:指针不停的回溯,时间复杂度不定,较高。
b.KMP算法 主串不需回溯i指针,将模式串向右“滑动”尽可能远的一段距离。

递归

1.需自我调用。
2.递归必须有出口。

3.疑难问题,及解决方法

对next和nextval函数的认识
next数组求解方法:
第一位的next值为0,第二位的next值为1,后面求解每一位的next值时,根据前一位进行比较。首先将前一位与其next值对应的内容进行比较,如果相等,则该位的next值就是前一位的next值加上1;如果不等,向前继续寻找next值对应的内容来与前一位进行比较,直到找到某个位上内容的next值对应的内容与前一位相等为止,则这个位对应的值加上1即为需求的next值;如果找到第一位都没有找到与前一位相等的内容,那么需求的位上的next值即为1。
*如何寻找前后缀
1.找前缀时,要找除了最后一个字符的所有子串。
2.找后缀时,要找除了第一个字符的所有子串。
现在有串P=abaabca,各个子串的最大公共前后缀长度如下表所示:

用一道题来解释
模式串S: abaabcac

分析next数组
1.一般来说,next数组的第一位为0,第二位为1,第三位的时候我们就观察模式串的前两位,发现是a,b
2.这时我们就要做最长前缀后缀的匹配,算出最大的公共元素长度,然后再加1,就是这一位的next的值。
3.第三位a的前两位是a和b,最大公共元素长度为0,所以该位的next的值是1.
分享nextval数组
1.求nextval[i]的值,我们要比较String[i]和String[next[i]]的值。
2.如果String[i]和String[next[i]]的字符相等,那么nextval[i]的值就等于nextval[next[i]]的值。
3.如果String[i]和String[next[i]]的字符不相等,那么nextval[i]的值就等于next[i]的值。

posted @ 2020-03-28 19:43  脸盲患者(钟恒)  阅读(136)  评论(0)    收藏  举报