数据结构(第四章)
数据结构(第四章)
串
- 定义:串是由零个或多个字符组成的有限序列。
- 串中任意多个连续的字符组成的子序列称为该串的子串,包含子串的串称为主串。某个字符在子串中的序号称为该字符在串中的位置。子串在主串中的位置以第一个字符在主串中的位置来表示。
串的存储结构
- 定长顺序存储
#define MaxSize 50
typedef struct {
char ch[MaxSize]; //每个分量存储一个数组
int length; //串的实际长度
}SString ;
- 堆分配存储方式
typedef struct {
char *ch; //按串长分配存储区,ch指向串的基地址
int length; //串的长度
}HString;
串的模式匹配
- BF算法(简单的模式匹配算法)
int BF(string S , string T){
int i =1; //母串的遍历指针
int j=1;//子串的遍历指针
while(i<=S.length()&&j<=T.length()){ //循环遍历
if (S[i]==T[j]){ //当子串与母串字符匹配,则向后遍历
++i;
++j;
}
else{ //该位置子串字符与母串不匹配,则母串退回到起始位置的下一位置。子串退回到初始位置
i=i-j+2;
j=1;
}
}
if (j>T.length())
return i-T.length();
else
return 0;
}
- KMP算法
- next数组
void Get_next(string T , int next[]){
int i=1; //遍历指针
int j=0;//前后缀相同的元素个数
next[1]=0;//第一位置无脑为0
while(j<T.length()){
if (j==0||T[i]==T[j]){
++i;
++j;
next[i]=j;
}else{
j=next[j];
}
}
}
int KMP(string S ,string T ,int next[]){
int i=1;
int j=1;
while(i<S.length()&&j<T.length()){
if (j==0||S[i]==T[j]){
++i;
++j;
}
else{
j=next[j];
}
}
if (j>T.length())
return i-T.length();
else
return 0;
}
- nextval数组
void Get_nextval(string T , int nextval[]){
int i=1; //遍历指针
int j=0; //前后缀相同的元素个数
nextval[1]=0;
while(j<T.length()){
if (j==0||T[i]==T[j]){
++i;++j;
if (T[i]!=T[j])
nextval[i]=j;
else
nextval[i]=nextval[j];
}
else{
j=nextval[j];
}
}
}
数组
- 定义:数组是由类型相同的数据元素构成的有序集合,每个元素称为数组元素
特殊矩阵的压缩存储
这里先进行了解
广义表
- 定义:广义表是线性表的推广
- 特点:广义表的定义是一个递归的定义
仅供参考,了解