串
一、串的定义
字符串简称串(string),计算机上非数值处理的对象基本上都是字符串数据,它以由空格或多个字符组成的有限序列。
一般即为:其中,S是串名,单引号括起来的是串的值;
可以是字母、数字或者其他字符;串中字符的个数n称为串的长度。n=0时的串称为空串(用
表示)。空格串是指只包含空格的串。它与空串不同,空格串是有内容有长度的,而且可以不止一个空格。串中任意个数的连续字符组成的子序列称为该串的子串,相应地,包含子串的串称为主串。 子串在主串中的位置就是子串的第一个字符在主串中的序号。
串的逻辑结构和线性表极为相似,区别进在于串的数据对象限定为数据集,在基本操作上,串和线性表有很大区别。线性表的基本操作主要以单个元素为操作对象,如查找、插入或删除某个元素等;而串的基本操作通常以子串作为操作对象,如查找、插入或删除一个子串等。
二、串的存储结构
1、定长顺序存储表示
类似于线性表的顺序存储,用一组连续的存储单元存储串值的字符序列。在串的定长顺序存储结构中,为每个串变量分配一个固定长度的存储区,即定长数组。
#define MAXLEN 256 //预定义最大串长
typedef struct {
char ch[MAXlEN]; //每个变量存储一个字符
int length; //串的实际长度
}SString;
串的实际长度只能小于或等于MAXLEN,超过预定义长度的串值会被舍去,称为截断。串长有两种表示方法:一如上述定义描述的那样,用一个额外的变量len来存放串的长度;二是在串值后面加一个不计入串长的字符“\0”,此时的串长为隐含值。
在一些串的操作(如插入、联接等)中,若串值序列的长度超过上界MAXLEN,约定用“截断法”处理,要克服这种弊端,只能不限制串长的最大长度,即采用动态分配的方式。
2、堆分配存储表示
typedef struct {
char *ch; //按串长分配存储区,ch指向串的基地址
int length; //串的长度
} HString;
在C语言中,存在一个称之为堆的自由存储区,并用malloc()和free()函数来完成动态存储管理。利用malloc()函数为每一个新产生的串分配一块实际串长所需的存储空间,若分配成功,则返回一个指向起始地址的指针,作为串的基地址,这个串有ch指针来指示;若分配失败,则返回NULL。已分配的空间可用free()函数释放掉。
3、块链存储表示
类似于线性表的链式存储结构,也可采用链表方式存储串值。由于串的特殊性,在具体实现时,每个节点既可以存放一个字符,也可以存放多个。每个节点称为块,故整个链表也被称为块链结构。
三、串的基本操作
StrAssign(&T,chars) :赋值操作。把串T的值赋值为chars
StrCopy(&T, S):由串S复制得到串T。
StrEmpty(S): 判空操作。若S为空串,则返回true,否则返回false。
StrCompare(S, T):比较操作。若S>T,则返回值1,若S=T,则返回值0,若S<T,则返回值-1。
StrLength(S):求串长,返回串中S的元素个数
SubString(&Sub, S, pos, len):求子串。用Sub返回串S的第pos个字符起长度为len的子串。
Concat(&T, S1, S2):串联接。用T返回由S1和S2联接而成的新串。
Index(S, T):定位操作。若S中存在与串值T相等的子串,则返回它在主串S中第一次出现的位置;否则返回函数值0
ClearString(&S):清空操作。将S清为空串。
DestroyString(S):销毁串。将串S销毁。
当然不同的高级语言对串的基本操作的定义不尽相同。在上述的定义操作中,串赋值StrAssign、串比较StrCompare、求串长StrLength、串联接Concat、及求子串SubString五种操作构成串类型的最小操作集,即这些操作不可能通过其他串操作来实现;反之,其他串操作(除串清除ClearString和串销毁DestroyString)都可以在该最小操作子集上来实现。
例如,可以利用比较操作,求子串和子串长的操作来实现Index(S, T)
int Index(S, T) {
int i=1,n=StrLength(S),m=StrLength(T);
while (i < n-m+1) {
SubString(Sub, S, , m);
if (StrCompare(Sub, T)!= 0) {
++i; //返回子串在主串中第一个元素的位置
} else {
return i;
}
return 0; //也就是主串中不存在这样的子串
}
四、串的模式匹配
1、简单的模式匹配
子串的定位操作通常成为串的模式匹配,它求的是子串在主串中的位置。这里采取定长顺序存储,给出一种不依赖于其他串操作的暴力匹配算法。
Index(SString S, SString T) {
int i=1, j=1;
while (j