串是什么
串(String)(或字符串)是由零个或者多个字符组成地有限虚空序列,一般记为
s = “ a 1 a 2 ⋅ ⋅ ⋅ a n a_1a_2···a_n a1a2⋅⋅⋅an” (n>=0)
- 其中s是串的名,双引号里面的是串的值;
- a i a_i ai(1<=i<=n)可以是字母、数字或者其他区字符;
- 串字符数目n为串的长度;
- 零个字符的串称为空串,其长度为零;
- 串中任意连续的字符组成的子序列称为该串的子串,包含字串的串相应的称为主串
- 字符串大小比较的是各个字符ACILL码值大小
串的存储结构
1、串的顺序存储结构
类似于线性表的顺序存储结构,用一组地址连续的存储单元存储串值的字符序列。按照预定的大小,为每一个定义的串变量分配一个固定长度的存储区,可以用定义数组的放视描述串。
#define MAXLEN 225 //串的最大长度
typedef struct {
char ch [MAXLEN+1]; //存储串的一维数组
int length; //串的当前长度
}SString;
这种定义方式是静态的,在编译时可就确定了串空间的大小。
串的堆式顺序存储(解决数组串需要预分配空间的问题)
为每一个新产生的串动态分配一块实际串长度所需的存储空间
typedef struct {
char *ch; //只要串非空,则按串长度分配存储区,否则ch指向NULL
int length; //串的当前长度
}HString;
2、串的链式存储
#define CHUNKSIZE 80 //用户定义的块大小
typedef struct Chunk{
char ch[CHUNKSIZE];
struct Chunk *next;
}Chunk;
typedef struct {
Chunk *head,*tail; //串的头指针和尾指针
int length; //串的当前长度
}LString;
在链式存储方式中,结点的大小直接影响到串处理的效率。
串的链式存储结构对某些串操作,例如联结操作等,有一定的方便之处,但总的来说,不如顺序结构来的灵活,链式占用存储空间大且操作复杂。
因为串在日常使用中还是想用多长就预分配多少空间的情况较多,链式串仅了解就行。