1、串的定义
串是由零个或多个字符组成的有限序列,又叫字符串。
一般记为s="a1a2a3···an"(n>0),其中,s是串的名称,用双引号括起来的字符序列是串的值,引号不属于串的内容。ai可以是字母、数字或其他字符,i就是该字符在串中的位置。零个字符的串称为空串,它的长度为零,可以直接用双引号""表示。
空格串,是只包含空格的串,它与空串不同,空格串是有内容有长度的,而且可以不止包含一个空格。
子串:串中任意个数的连续字符组成的子序列(包括空串)称为该串的子串,相应的含子串的串称为主串。 真子串是指不包含自身的所有子串。
字符位置:字符在序列中的序号为该字符在串中的位置。
子串位置:字串第一个字符在主串中的位置。
2、串的比较
串的比较是通过组成串的字符之间的编码来进行的,字符的编码是指字符在对应字符集的序号。计算机中常用字符是使用标准的ASCII编码。
串相等:当且仅当两个串的长度相等并且各个对应位置上的字符都相同时,这两个串才相等。
对于两个不相等的串,判定他们大小的方法:
给定两个串:s="a1a2···an",t="b1b2···bm",当满足以下条件之一时,s<t。
1.n<m,且ai=bi(i=1,2···n)
2.存在某个字符k<min(m,n),使得ai=bi(i=1,2···,k-1),ak<bk。
2、串的抽象数据类型
串的基本操作与线性表有着很大差别。线性表更关注单个元素的操作,但是在串中更多的是查找子串的位置、得到指定位置的子串,替换子串等操作。
ADT 串(string)
Data
串中元素仅由一个字符组成,相邻元素具有前驱和后继关系
Operation
StrAssign(T,*chaars):生成一个其值等于字符串常量chars的串T。
Strcopy(T,S):串S存在,由串S复制得到串T。
ClearString(S):串S存在,将串S清空
StringEmpty(S):若串S存在,返回True,否则返回false。
StrLength(S):返回串S的元素个数,即串的长度。
StrCompare(S,T):若S>T,返回值>0,若S=T返回0,若S<T,返回值<0。
Concat(T,S1,S2):用T返回由S1和S2联接而成的新串。
SubString(Sub,S,pos,len):串S存在,1<=pos<= StrLength(S),
且0<=len<= StrLength(S)-pos+1,
用sub返回第pos个字符起长度为len的子串。
Index(S,T,pos):串S和T存在,T是非空串,1<=pos<= StrLength(S)。
若子串存在和串T相同的子串,则返回它在主串S中第
pos个字符后面第一次出现的位置,否则返回0.
Replace(S,T,V):串S、T和V存在,T是非空串,用V替换主串S中出现的所以与T相等的不重叠的子串
StrInsert(S,pos,T):串S和T存在,1<=pos<= StrLength(S)+1。
在串S的第pos个字符前添加串T。
StrDelete(S,pos,len):串S存在,1<=pos<= StrLength(S)-len+1.
从串S中删除第pos个字符起长度为len的子串。
endADT
3、串的储存结构
串的顺序储存结构是用一组地址连续的储存单元来储存串中的字符序列的。按照预定义的大小,为每个定义的串变量分配一个固定长度的储存区。一般是用定长数组来定义。
对于串的链式储存结构,与线性表是相似的,但如果只用一个结点对应一个字符,就会存在很大的空间浪费。因此我们可以考虑一个结点存放多个字符,最后一个结点若是未被占满,可以用“#”或者其他非串值字符补全。