数据结构:串(String)【详解】

您所在的位置:网站首页 子串在主串中的位置是唯一的 数据结构:串(String)【详解】

数据结构:串(String)【详解】

2024-07-03 09:33| 来源: 网络整理| 查看: 265

友情链接:数据结构专栏

目录 串【知识框架】一、串的定义二、串的存储结构1、定长顺序存储表示2、堆分配存储表示3、块链存储表示 三、串的基本操作四、串的模式匹配(重点)1、简单的模式匹配算法2、KMP算法(1)字符串的前缀、后缀和最大公共前后缀长度(2)对算法的改进方法(3)KMP算法的进一步优化 附录上文链接下文链接专栏参考资料

串 【知识框架】

在这里插入图片描述

一、串的定义

串( string)是由零个或多个字符组成的有限序列,又名叫字符串。 一般记为: S = ′ a 1 a 2 . . . a n ′ ( n > = 0 ) S='a_1a_2...a_n '(n>=0) S=′a1​a2​...an′​(n>=0)。 其中, S S S是串名,单引号括起来的字符序列是串的值; a n a_n an​ 可以是字母、数字或其他字符;串中字符的个数 n n n称为串的长度。 另外还有一些其它概念:

空串: n = 0 n=0 n=0时的串称为空串。空格串:是只包含空格的串。注意它与空串的区别,空格串是有内容有长度的,而且可以不止一个空格。子串与主串:串中任意个数的连续字符组成的子序列称为该串的子串,相应地,包含子串的串称为主串。子串在主串中的位置就是子串的第一个字符在主串中的序号。

串的逻辑结构和线性表极为相似,区别仅在于串的数据对象限定为字符集。在基本操作上,串和线性表有很大差别。线性表的基本操作主要以单个元素作为操作对象,如查找、插入或删除某个元素等;而串的基本操作通常以子串作为操作对象,如查找、插入或删除一个子串等。

二、串的存储结构 1、定长顺序存储表示

类似于线性表的顺序存储结构,用一组地址连续的存储单元存储串值的字符序列。在串的定长顺序存储结构中,为每个串变量分配一个固定长度的存储区,即定长数组。

#define MAXLEN 255 //预定义最大串长为255 typedef struct{ char ch[MAXLEN]; //每个分量存储一个字符 int length; //串的实际长度 }SString;

串的实际长度只能小于等于MAXLEN,超过预定义长度的串值会被舍去,称为截断。串长有两种表示方法: 一是如上述定义描述的那样,用一个额外的变量len来存放串的长度;二是在串值后面加一一个不计入串长的结束标记字符“\0”,此时的串长为隐含值。 在一些串的操作(如插入、联接等)中,若串值序列的长度超过上界MAXLEN,约定用“截断”法处理,要克服这种弊端,只能不限定串长的最大长度,即采用动态分配的方式。

2、堆分配存储表示

堆分配存储表示仍然以一组地址连续的存储单元存放串值的字符序列,但它们的存储空间是在程序执行过程中动态分配得到的。

typedef struct{ char *ch; //按串长分配存储区,ch指向串的基地址 int length; //串的长度 }HString;

在C语言中,存在一一个称之为“堆”的自由存储区,并用malloc()和free()函数来完成动则返回一个指向起始地址的指针,作为串的基地址,这个串由ch指针来指示;若分配失败,则返回NULL。已分配的空间可用free()释放掉。 上述两种存储表示通常为高级程序设计语言所采用。块链存储表示仅做简单介绍。

3、块链存储表示

类似于线性表的链式存储结构,也可采用链表方式存储串值。由于串的特殊性(每个元素只有一个字符),在具体实现时,每个结点既可以存放一个字符, 也可以存放多个字符。每个结点称为块,整个链表称为块链结构。图(a)是结点大小为4 (即每个结点存放4个字符)的链表,最后一个结点占不满时通常用“#”补上;图(b)是结点大小为1的链表。 在这里插入图片描述

三、串的基本操作 StrAssign(&T, chars): 赋值操作。把串T赋值为 charsStrcopy(&T, S): 复制操作。由串S复制得到串T。StrEmpty(S): 判空操作。若S为空串,则返回TRUE,否则返回 FALSEStrCompare(S,T): 比较操作。若S>T,则返回值>0;若S=T,则返回值=0;若S


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3