定义
字符串一般简称为串
串是由零个或多个字符组成的有限序列
一般记为 s=‘a1a2a3…an’(n>=0)
串中的字符数目n为串的长度。
零个字符的串称为空串(用Ø 表示),而全是空格的串称为空格串(注意区分)
串相等<==>两个串长度相等,且相对应的位置的字符都相等
串和线性表的区别在于
1.串的数据对象约束于字符集。
2.串的基本操作和线性表有差别
线性表多以单个元素为操作对象
而串通常以串的整体为操作对象
表示与实现
定长顺序存储
使用一组地址连续的存储单元存储串值的字符序列
表示
const int Max_len=255;
typedef unsigned char SString[Max_len+1]; //0号位置存放串的长度
0号位置存放串的长度
串的实际长度可在此范围内任意取,但若超出预定最长长度,则超出部分的串值就会被舍去,即发生截断。
因此在进行对串的操作时,要考虑截断因素。
串连接操作
求子串操作
堆分配存储表示
即动态分布串的存储空间
可以解决截断的问题
typedef struct{
char *char_head;
int length;
}Hstring;
其操作仍是以“字符序列的复制”为基础进行的
堆分配的串既有顺序存储的优点,又无串长限制,因此更常被使用
块链存储表示
使用链表存储串,但每个结点可以存储串中n个字符,当串长不是n的整数倍时,最后一个结点的剩余位置补上#号等非串值符号
其数据结构表示为
int const Chunksize=80;
typedef struct Chunk{
char ch[Chunksize];
struct Chunk* next;
}Chunk;
typedef struct{
Chunk* head, *tail;
int curlen;
}Lstring;
一般情况下,对串操作时只需要从前往后扫描即可,所以不需要建立双向链表。
且为了方便进行联结操作,才设立了尾指针。
结点大小的选择与顺序存储方式的格式选择一样都很重要,它直接影响着串处理的效率
存储密度=串值所占的存储位 ÷ 实际分配的存储位
存储密度较小时,运算方便,但存储占用量大
另外字符集越小,字符的机内编码越短,这也影响串值存储方式的选取。
总体来说
块链存储结构对于部分串操作(联接)等有一定的方便之处,但总体来说没有顺序结构灵活。
它占用存储量大且操作复杂。
串的模式匹配
在串中寻找子串(模式串)的位置就叫做模式匹配
详细内容以前已经写过了,大家也可以在网上找很多优质解答,就溜了…
优质解答