数据结构-串

212 阅读2分钟

定义

串在计算机中就是我们所常说的字符串,是由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是指向串起始地址的指针。