4.1 串类型的定义
字符串可以看作是一种特殊的线性表,字符串的数据对象约束为字符集(非数值数据)。
不同的应用所处理的串的特点亦不相同。
在线性表的基本操作中,大多以“单个元素”作为操作对象,而在串中则是以“串的整体”或一部分作为操作对象。
-
串的定义:
串(String)是零个或多个字符组成的有限序列。
一般记为:s=′a1a2…an′ (n≥0)
s是串的名字, a1a2…an是串s的值
ai可以是字母、数字或其它字符;
串内字符的数目n称为串的长度。
零个字符的串称为空串(null string),其长度为0。 -
子串:
串中任意个连续的字符组成的子序列称为该串的子串。
-
主串:
包含子串的串相应地称为主串。
-
字符的位置:
通常将字符在串中的序号称为该字符在串中的位置。
-
子串的位置:
以子串的第一个字符在主串中的位置来表示。
-
两个串相等:
当且仅当两个串的值相等时,称这两个串是相等的,即只有当两个串的长度相等, 并且每个对应位置的字符都相同时才相等。
-
关于串定义的说明:
串定义中的一对单引号本身不属于串!
其作用避免与变量名或数的常量混淆
空串(null string)和空格串(blank string)是不同的!
为了清晰起见,用符号“ø”表示“空串” -
在操作上:
在线性表中,操作的对象基本上都是数据元素;
在串中,操作的对象通常以子串为单位。
例如:查找子串、求取子串、插入或删除子串等。
对于串的基本操作集可以有不同的定义方法,在使用高级程序设计语言中的串类型时,应以该语言的参考手册为准。
在上述抽象数据类型定义的13种操作中,
串赋值 StrAssign、串复制 Strcopy、
串比较 StrCompare、求串长 StrLength、
串联接 Concat 以及求子串 SubString
等六种操作构成串类型的最小操作子集。
串的逻辑结构和线性表极为相似,区别仅在于串的数据对象约束为字符集。
串的基本操作和线性表有很大差别。
在线性表的基本操作中,大多以“单个元素”作为操作对象;
而在串的基本操作中,通常以“串的整体”作为操作对象。
在早期的程序设计语言中,串只是作为输入或输出的常量出现,则只需存储此串的串值,即字符序列即可。之后在多数非数值处理的程序中,串均以变量的形式出现,因此作为一个数据类型也就存在一个存储表示和实现的问题。
4.2 串的表示和实现
1.串的定长顺序存储表示
用一组地址连续的存储单元存储串值的字符序列。这是一种静态存储结构,串值的存储分配是在编译时完成的。因此,需要预先定义串的存储空间大小。
#define MAXSTRLEN 255; //定义能处理的最大的串长度
typedef unsigned char SString[MAXSTRLEN+1]; //0号单元存放串的长度
串的实际长度可在这个预定义长度的范围内随意设定,超过预定义长度的串值则被舍去,称之为“截断”。
串的联接算法
status ConCat(SString S1,SString S2,SString &T){
//用T返回由S1和S2联接而成的新串。若未截断,则返回TRUE,否则FALSE。
if(S1[0]+S2[0]<=MAXSTRLEN){
//未截断
T[1..S1[0]]=S1[1..S1[0]