串、数组和广义表
前言
本章的内容不多,数组和广义表了解即可,串中的两个模式匹配算法需要重点学习一下
1 串的定义
串(String):零个或多个任意字符组成的有限序列,s = “a1a2…an”(n≥0),s是串名,a1…是串值,字符个数n是串长,当n为0时,称为空串,用Φ表示
几个术语
(1)子串:串中任意个连续字符组成的子序列(含空串)称为该串的子串
例如,“abcde”的子串有:
“”、“a”、“ab”、“abc”、“abcd”和“abcde”等
真子串是指不包含自身的所有子串
(2)主串:包含子串的串相应地称为主串
(3)字符位置:字符在序列中的序号为该字符在串中的位置
(4)子串位置:子串第一个字符在主串中的位置
(5)空格串:由一个或多个空格组成的串,与空串不同
(6)串相等:当且仅当两个串的长度相等并且各个对应位置上的字符都相同时,这两个串才是相等的
所有空串是相等的
2 案例引入
串的应用非常广泛,计算机上的非数值处理的对象大部分是字符串数据,例如:文字编辑、符号处理、各种信息处理系统等等
案例1:病毒感染检测
研究者将人的DNA和病毒的DNA均表示成由一些字母组成的字符串序列
然后检测某种病毒DNA序列是否在患者的DNA序列中出现过,如果出现过,则此人感染了该病毒,否则没有感染
3 串的类型定义、存储结构及其运算
3.1 类型定义
ADT String {
数据对象:
D = { ai | ai ∈ CharacterSet,i = 1,2,…,n, n ≥0 }
数据关系:
R1 = { <ai-1,ai> | ai-1,ai ∈ D,i = 2,…,n }
基本操作:
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) //串销毁
} ADT String
3.2 串的存储结构
串中元素逻辑关系与线性表的相同,串可以采用与线性表相同的存储结构,分别称为顺序串和链串,其中顺序串的使用更为普遍
串的顺序存储结构
#define MAXLEN 255
typedef struct{
char ch[MAXLEN+1];
int length;
}SString