数据结构

第0章节

代码注意事项

1.需要返回出错信息用bool,最后还要return true;
2.函数的输入是操作对象,以及给定的变量,需要带出来的值也用引用&而不是返回值
3.记得写注释//...
4.最后记得修改length

第二章 线性表

题目

2.2

p18 t3

void del_x(SqList & L,ElemType x){
	int k=0;
	for(int i=0;i<L.length;++i){
		if(L.data[i]!=x){
			L.data[k]=L.data[i];
			k++;
		}
	}
	L.length=k;
}

p18 t6

bool del_same(SqList & L){
	if(L.length==0)return false; 
	int k=0;	//记录非重复的元素个数 
	for(int i=0;i<L.length;++i){
		if(i==0||L.data[i]!=L.data[k-1]){ 
			L.data[k]=L.data[i];
			k++;
		}
	}
	L.length=k;
	return true;
}

p18 t7

bool merge(SqList A,SqList B,SqList &C){
	if(A.length+B.length>C.MaxSize)
		return false;
	int i=0,j=0,k=0;
	while(i<A.length&&j<B.length){
		if(A.data[i]<=B.data[j])
			C.data[k++]=A.data[i++];
		else 
			C.data[k++]=B.data[j++];
	}
	while(i<A.length)
		C.data[k++]=A.data[i++];
	while(j<B.length)
		C.data[k++]=B.data[j++];
	C.length=k;
	return true;
} 

第三章 栈 队列 数组

栈的应用

表达式求值
image

所谓的前中后就是运算符的位置
后缀表达式:先数后符
前缀表达式:先符后数

中转前后:将中按顺序分解为多个元运算,每个元运算有自己的操作符,操作数,按照先数后符或先符后数将这个元运算写出来,它就又成为了一个操作数!

中转后的机算过程
image

后缀表达式的计算
image

第四章 串

KMP

首先看朴素模式匹配
image

KMP
由于在某个位置匹配失败时,可以确定当前位置前面的部分字符都是和模式串相同的,所以在整个匹配开始之前仅仅通过模式串的自我匹配就可以知道在模式串的每个位置匹配失败时,模式串匹配指针应该移动到哪里开始匹配(即求ne数组),并且是从匹配失败的位置继续匹配,主串指针不懂,而模式串指针前移到提前求好ne数组的位置。
唯一例外就是在模式串的第一位置就匹配失败,这样就是固定模式串指针不变,主指针加1(为了方便写代码,可以让ne[1]=0,然后再i++,j++)

总思路:

  1. 求模式串的ne数组
  2. 由ne[]数组进行匹配

代码:(串下标都从1开始)
函数版本

int index_kmp(string s,string t, int ne[]){
	int i=1,j=1;
	while(i<=s.length&&j<=t.length){
		if(j==0||s[i]==t[j]){
			i++;j++;
		}else j=ne[j];
	}
	if(j>t.length)return i-t.length;
	return 0;
}

刷题版本

	//求ne数组过程
	待续 

	//整体匹配过程 
	int i=1,j=1;
	while(i<=s.size()&&j<=t.size()){
		if(j==0||s[i]==t[j]){
			i++;j++;
		}else j=ne[j];
		//if(j>t.size())	//如果需要匹配所有就先不break,如果这要匹配一个就直接break
	}
	

image

第五章 树和二叉树

BST=二叉搜索树=二叉排序树=二叉查找树

第六章 图

深度优先遍历可以判断有向图是否存在回路(设置一个栈内标记,如果节点进入了递归调用栈,并且后面又可以访问某个已经在栈内的节点,说明有向图存在回路),无向图也可以用这种方法。

bfs广度优先遍历不能用来判断回路

posted @ 2022-11-27 20:43  林动  阅读(9)  评论(0编辑  收藏  举报