一、串的定义
- 串:内容受限的线性表
- 串:(String):零个或多个任意字符组成的有限序列
- 子串:一个串中任意个连续字符组成的子序列(含空串)称为该串的子串
- 真子串:指不包含自身的所有子串
- 主串:包含子串的串相应的称为主串
- 字符位置:字符在序列中的序号为该字符在传中的位置
- 子串位置:子串第一个字符在主串中的位置
- 空格串:由一个或多个空格组成的串,与空串不同
- 串相等:当且仅当两个串的长度相等并且各个对应位置上的字符都相同时,这两个串才是相等的
所有空串都相等
二、串的类型定义、存储结构及其运算
1、类型定义
StrAssign(&T,chars) //串赋值
StrCompare(S,T) //串比较
StrLength(S) //求串长
Concat(&T,S1,S2) //串连结
SubString(&Sub,S,pos,len)//求子串
StrCopy(&T,S) //串拷贝
StrEmpty(S) //串判空
ClearString(&S) //清空串
Index(S,T,pos) //子串的位置
Replace(&S,T,V) //串替换
StrInsert(&S,pos,T) //子串插入
StrDelete(&S,pos,len) //子串删除
DestroyString(&S) //串销毁
2、串的顺序存储结构
#define MAXLEN 255
typedef struct
{
char ch[MAXLEN+1];
int length;
}SString;
3、串的链式存储结构
- 优点:操作方便
- 缺点:存储密度较低
- 存储密度=串值所占的存储/实际分配的存储
- 可将多个字符存放在一个结点中,以克服其缺点
- 串的链式存储结构——块链结构
#define CHUNKSIZE 80
typedef struct Chunk
{
char ch[CHUNKSIZE];
struct Chunk *next;
}Chunk;
typedef struct
{
Chunk *head,*tail; //串的头指针和尾指针
int curlen; //串的当前长度
}LString;
4、串的模式匹配算法
- 目的:确定主串中所含子串(模式串)第一次出现的位置(定位)
- 应用:搜索引擎、拼写检查、语言翻译、数据压缩
- 种类:
- BF算法(Brute-Force,又称古典的、经典的、朴素的、穷举的)
- KMP算法(特点:速度快)
BF算法描述
int Index_BF(SString S,SString T)
{
int i=1,j=1;
while(i<=S.length&&j<=T.length)
{
if(s.ch[i]==t.ch[j])
{
++i;++j;
}
else
{
i=i-j+2;j=1;
}
}
if(j>=T.length)
return i-T.length;
else
return 0;
}
KMP算法描述
int Index_KMP(SString S,SString T)
{
int i=1,j=1;
while(i<S.length&&j<T.length)
{
if(j==0||s.ch[i]==t.ch[j])
{
++i;++j;
}
else
{
j=next[i];
}
}
if(j>T.length)
return i-T.length;
else
return 0;
}
void get_next(SString T,int &next[])
{
i=1;next[1]=0;j=0;
while(i<T.length)
{
if(j==0||T.ch[i]==T.ch[j])
{
++i;++j;
next[i]=j;
}
else
j=next[j];
}
}
三、数组
1、基本概念
- 数组:按一定格式排列起来的具有相同类型的数据元素的集合
- 一维数组:若线性表中的数据元素为非结构的简单元素,则称为一维数组
- 一维数组的逻辑结构:线性结构。定长的线性表
- 声明格式:数据类型 变量名称【长度】
- 二维数组:若一维数组中的数据元素又是一维数组结构,则称为二维数组
- 二维数组的逻辑结构:
- 非线性结构:每一个数据元素既在一个行表中,又在一个列表中
- 线性结构,定长的线性表:该线性表的每个数据元素也是一个定长的线性表
- 声明格式:数据类型 变量名称【行数】【列数】
- 数组特点:结构固定——定义后,维数和维界不再改变
- 数组基本操作:除了结构的初始化和销毁之外,只有取元素和修改元素值的操作
2、数组的抽象数据类型定义
InitArray(&A,n,bound1,...,boundn) //构造数组A
DestroyArray(&A) //销毁数组A
Value(A,&e,index1,...,indexn) //取数组元素值
Assign(A,&e,index1,...,indexn) //给数组元素赋值
3、特殊矩阵的压缩存储
- 什么是压缩矩阵?:若多个数据元素的值都相同,则只分配一个元素值的存储空间,且零元素不占存储空间
- 什么样的矩阵可以压缩?:对称矩阵,对角矩阵,三角矩阵,稀疏矩阵等
- 什么叫稀疏矩阵?:矩阵中非零元素的个数较少(一般小于5%)
四、广义表
-
广义表一般用大写字母表示,小写字母表示原子
-
表头:若广义表非空,则其第一个元素a1就是表头
注:表头可以是原子,也可以是子表
-
表尾:除表头之外的其他元素组成的表
注:表尾不是最后一个元素,而是一个子表
-
广义表性质:
- 广义表中的数据元素有相对次序:一个直接前驱和一个直接后继
- 广义表的长度定义为最外层所包含元素的个数
- 广义表的深度定义为该广义表展开后所含括号的重数
- 广义表可以为其他广义表共享
- 广义表可以是一个递归表
- 广义表是多层次结构,广义表的元素可以是单元素,也可以是子表,而子表的元素还可以是子表