这片文章给大家讲解一下字符串。
1.字符串的逻辑结构
字符串(String)这个东西 ,相信大家都不陌生。字符串,简单来说,是有限字符集中的零个或多个字符组成的有限序列。它是一种特殊的线性表,(数据集为字符集,元素之间具有线性关系)。
字符串的特点:数据元素都是字符,使得它的操作的对象一般不再是点那个数据元素,而是一组数据元素(字符子串)。
2.字符串结构上定义的操作
①字符串置空 ②字符串赋值(创建) ③字符串赋值 ④字符串比较 ⑤求字符串的长度
⑥字符串联接 ⑦取字串 ⑧定位 ⑨字符串置换 ⑩字符串插入
11.字符串删除 12.判断是否为空串 13.字符串销毁(释放存储空间)
其中下面五个操作称为最小操作子集:
①字符串赋值,StrAssign ②字符串比较,StrCompare ③字符串联接,Concat ④求串长,StrLength
⑤求字串,SubString
注:这五种操作不可以利用其它操作来实现,但是其它操作可以在这个最小操作上实现。
3.字符串ADT
在很多计算机程序设计语言中,已经把字符串ADT物理实现为字符串类型(String),即我们可以直接使用语言提供的字符串数据类型来求解问题。例如C++对字符串ADT的实现,函数库名为“string.h”,要在C++里使用串操作,只需要加载该头文件即可。
4.字符串的存储结构
存储方式:采用顺序存储结构。即用一组地址连续的存储空间依次存储串的字符序列。
5.字符串操作的实现
(1)判断串相等
这个操作,一般是先判断长度是否相等,然后再逐个字符的比较。
(2)字符串联结
这个操作的意思就是把一个字符串全部添加到另一个字符串的末尾,组成一个新的字符串。但也有特殊情况,就是一个字符串只有一部分添加到了另一个字符串的末尾,之所以会出现这种情况,是因为两个字符串加起来的长度可能超过其中任意一个字符串的最大长度,从而被自动舍弃了一部分(或者直接报溢出错误)。
(3)取字串
取字串有两种取法,一种是已知字串的起点和长度;另一种是已知字串的起点和终点。
(4)子串定位
模式匹配:在一个主串中,查找字串是否存在,若存在则返回字串的位置,不存在返回0。字串称为模式。
实现的算法有很多,如BF算法、KMP算法等。
BF算法就是我们常说的暴力匹配算法,算法思想简单,容易写,但效率低下;目前我已知的匹配效率最高的算法就是KMP算法,但是这个算法理解起来比较难,不过好在C++已经将该算法作为内置函数加以实现,读者若想调用此算法,导入相关库即可加以使用(具体使用方法可问度娘)。
(5)串的置换 Replace(s,t,v)
将串s中所有字串t的出现都置换为v
在s中定位t,然后根据t和v二者的长度,如果t的长度小于v,那么需要将s后移相应的单位长度(v的长度减t的长度)再进行替换;如果t与v的长度相同,则直接进行替换;如果t的长度大于v,则可以先进行替换,然后将s前移相应的单位长度。
(6)串的插入 Insert(s,pos,t)
移动或用取字串、联结运算实现(有溢出问题)
(7)串的删除 Delete(s,pos,len)
将主串s从pos开始截取len个长度的字串然后删除。
由于程序设计语言中已经将这些功能实现为内置函数,这里就不对这些功能进行编码实现了。