串
串的定义
串的逻辑结构和线性表极为相似,区别仅在于串的数据对象约束为字符集。然而,串的基本操作和线性表有很大差别。在线性表的基本操作中,大多以单个元素作为操作对象,列入,在线性表中查找某个元素,求取某个元素,在某个位置上插入一个元素或删除一个元素等;而在串的基本操作中,通常以串的整体作为操作对象,例如,在串中查找某个子串,求取一个子串,在串的某个位置上插入一个子串,以及删除一个子串等。
串的存储结构
串的顺序存储
第一种
//-----串的定长顺序存储结构-----
#define MAXLEN 255 //串的最大长度
typedef struct{
char ch[MAXLEN+1]; //存储串的一维数组
int length; //串的当前长度
}SString;
这种定义方式是静态的,在编译时就确定也串空间的大小。
第二种
//------串的堆式存储结构------
typedef struct{
char *ch; //若是非空串,则按串长分配存储区,否则ch为NULL
int length; //串的当前长度
}HString;
这种方式是动态的,能够根据实际情况动态地分配和释放数组空间。
串的链式存储结构
//------串的链式存储结构------
#define CHUNKSIZE 80 //可由用户定义的块大小
typedef struct Chunk{
char ch[CHUNKSIZE];
struct Chunk *next;
}Chunk;
typedef struct{
Chunk *head,*tail; //串的头尾指针
int length; //串的当前长度
}LString;
串值得链式存储结构对某些串操作,如链接操作等,有一定的方便之处,但总的说来,不如顺序存储结构灵活,它占用存储量大且操作复杂。此外,串值再链式存储结构时,串操作的实现和线性表在链表存储结构中的操作类似。
串的模式匹配算法——BF算法
子串定位运算通常称为串的模式匹配或串匹配。此运算的应用非常广泛,比如在搜索引擎、拼写检查、语言翻译、数据压缩等应用中,都需要进行串匹配。串的模式匹配设有两个字符串S和T,S为主串也成为正文串,T为子串也叫作模式,在主串S中查找与模式T相匹配的子串,如果匹配成功,确定相匹配的子串中的第一个字符出现在S串中的位置。
最简单直观的模式匹配算法是BF(Brute-Force)算法。
匹配步骤图如下:
算法描述
int Index_BF(SString S,SString T,int pos){
int i=pos,j=1;//初始化,pos为主串中开始搜索的位置,一般为1
while(i<=S.length&&j<=L.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; //匹配失败
}
}
参考自《数据结构》严蔚敏