计算机上的非数值处理对象基本上是字符串数据:
串的定义:
是由零个或者多个字符组成的有限序列,是数据元素为单个字符的特殊线性表。
一般定义为: s=‘a1 a2 a3 a4 .... an’ (n>=0)
空串和空白串的区别:
空串是指长度为零的串,空白串是指包含一个多个空白字符的字符串。
----------------------------------------------------------------------------------------------------------------
串的抽象数据类型定义:
ADT String{
数据对象:D={ ai | ai 属于 Character , i=1,2,3.... n , n>=0 }
数据关系:R1={ <ai-1,ai> | ai-1,ai 属于 D, i=2,...,n }
基本操作:
StrAssign( &T , chars )
初始条件:chars是字符串变量。
操作结果:生成一个其值等于chars的串T。
StrCopy( &T , S )
初始条件:串 S 存在。
操作结果:由串S复制得串T。
StrEmpty( S )
初始条件:串S已经存在。
操作结果:若 S 为空串,则返回TRUE,否则返回 FALSE。
StrCompare( S , T )
初始条件:串 S 和 T存在 。
操作结果:若 S>T ,则返回值 >0, 若 S=T ,则返回值 =0, 若 S<T ,则返回值 <0, 。
StrLength( S )
初始条件:串 S 存在。
操作结果:返回 S 的元素个数,成为串的长度。
Concat( &T ,S1 ,S2 )
初始条件:串 S1 和串 S2 存在。
操作结果:用 T 返回由 S1 和 S2联接而成的新串。
SubString( &Sub , S , pos , len )
初始条件:串S存在, 1<=pos<=StrLength( S )且 0<=len<=StrLength(S)-pos+1。
操作结果:用 Sub 返回串 S 的第 pos 个字符起长度为 len 的子串。
Index( S ,T ,pos )
初始条件:串 S 和 T 存在,T是非空串, 1<=pos<=StrLength( S )。
操作结果:若主串 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 的子串。
DestroyString( &S )
初始条件:串 S 存在 。
操作结果:串 S 被销毁 。
}
----------------------------------------------------------------------------------------------------------------
对串长有两种表示方法:
#define MAXSTRLEN 255 //用户可在255内定义最大串长
typedef unsigned char SString[MAXSTRLEN+1]; //0号单元存放串的长度
1、以下标为 0 的数组分量存放串的实际长度,如PASCAL语言中的串类型采用这种表示方法。
2、在串值后面加一个不计入串长的结束标志字符,如在C语言中以 ‘\0’表示串值得终结。
堆分配的特点:
仍用一组地址连续的存储单元存放串值存放串值字符序列,但它们的存储空间是在程序执行过程中动态分配而得的。
C语言的动态分配函数 malloc()来为每一个新产生的串分配一块实际串长所需的存储空间,若分配成功,则返回一个指向起始地址的指针,作为串的基址,和free()。
//------------------------堆分配的存储结构-------------------
typedef struct {
char *ch; //若是非空串,则按串长分配存储区,否则 ch 为NULL
int length; //串长度
}HString;