数据结构中,字符串要单独用一种存储结构来存储,称为串存储结构。这里的串指的就是字符串。
严格意义上讲,串存储结构也是一种线性存储结构,因为字符串中的字符之间也具有一对一的逻辑关系,只不过,与之前所学的线性存储结构不同,串结构只用于存储字符类型的数据。
====串存储结构的具体实现
存储一个字符串,数据结构包含以下3中具体存储结构;
1.定长顺序存储:实际上就是用普通数组(又称静态数组)存储。
2. 堆分配存储:用动态数组存储字符串。
3.块链存储:用链表存储字符串。
===
静态数组:长度是固定的。
动态数组:使用malloc 和free函数动态申请和释放空间,动态数组的长度是可变的。
串的定长顺序存储结构:可以简单地理解为采用固定长度的顺序存储结构来存储字符串,因此限定了其底层实现只能使用静态数组。
===
串的堆分配存储,其具体实现方式是采用动态数组存储字符串。
通常,编程语言会将程序占有的内存空间分成多个不同的区域,程序包含的数据会被分门别类存储到对应的区域。拿C语言来说,程序会将内存分为4个区域,分别为堆区,栈区、数据区、代码区。
与其他区域不同,堆区的内存空间需要程序员手动使用malloc 函数申请,并且在不用后要手动通过free 函数将其释放。
C语言中使用malloc 函数最多的场景是给数组分配空间,这类数组称为动态数组。
例如:char *a = (char*) malloc(5*sizeof(char));
此行代码创建了一个动态数组a,通过malloc 申请了5个char 类型大小的堆存储空间。
动态数组相比普通数组(静态数组)的优势是长度可变,换句话说,根据需要动态数组可额外申请更多的堆空间。
===串的块链存储结构===
串的块链存储,指的是使用链表结构存储字符串。
本节实现串的块链存储使用的是无头节点的单链表。我们知道,单链表中的单强调的仅仅是链表各个节点只能有一个指针,并没有限制数据域中存储数据的具体个数。因此在设计链表节点的结构时,可以令各节点存储多个数据。
使用链表存储字符串,其最后一个节点的数据域不一定会被字符串全部占满,对于这种情况,通常会用‘#’或其他特殊字符将最后一个节点填满。