定义
串在计算机中就是我们所常说的字符串,是由n个字符组成的优先序列(当n=0时,称这个串为空串)。由一个或多个空格字符组成的串称之为空格串,空格串并不是空串。
string a = “ ”;
string b = “”;
//上述字符串,a包括三个空格字符的字符串,b是空串。串a的串长为3,串b的串长为0。
(在C++中,串通常由双引号包括起来,代表串的开始和结尾)
串的实现
虽然在很多高级语言中已经拥有串这种数据类型或者和串相关的类,但是我们仍然可以自定义一个串类来实现串的功能。
串可以有多种实现方法,这里展现三种。
字符数组实现
#define MaxSize 1024
struct string_ch {
char str[MaxSize];
int length;
};
由于串本身就和字符数组的性质非常相似,所以我们可以用字符数组定义串的结构体。但是不足之处在于由于数组是定长的,这也导致这种结构下的串也是有最大长度的,如果超出这个长度就会被截断;而且由于数组本身预分配空间,导致如果数组容量过大会导致内存利用率低。
链表实现
既然可以字符数组实现串,同样的,我们也可以用链表来实现串。但是链表也会有相应的缺点,因为最简单的单链表其结点也有两个数据元素,即存放数据的data和指向下一个结点的指针next,如果每一个字符都单独占用一个结点,next指针又会占用太多内存资源。所以往往一个结点的用于存放data的数据类型并不是字符型char,而是char数组,数组大小自定义,如果大小太小会导致占用大量无效内存,太大又会导致内存利用率低(和字符数组的缺点一致)。
堆分配实现
struct string_heap {
char *str;
int length;
};
这个和数组在逻辑上是一样的,都是采用一部分连续的内存空间来进行存储串的各个字符,不同的是数组的空间是固定的,而堆分配是动态分配的,str是指向串起始地址的指针。