前言 串是一种比较特殊的数据结构,它是计算机上非数值处理的主要对象。
事实上在C语言中,是没有“字符串”这个变量类型的,虽然可以通过字符指针 char *p 这样来记录一个字符串,p本质上仍是一个字符指针,保存的是一个字符的地址。因此,C语言中的保存一个字符串,只是保存它首个字符的地址。但是到了诸如Java这样的语言里,提供了一种String类,可以直接用String s 来记录字符串,String和int、char一样是一种数据类型(只不过不是基本的数据类型,而是属于引用类型)。并且Java提供了很多操作函数,可以直接实现对字符串的相关操作。当然,C语言中虽然没有明确的字符串类型,但是同样存在字符串操作函数。
串的定义 定义:串(或字符串)是由零个或多个字符组成的有限序列,一般记为:s = ‘a1a2…an’(n>=0) 串的名称:s 串的值:用单引号(有些书中也用双引号)括起来的字符序列,可以是数字、字母或者其他字符。但是单引号本身不属于串,它的作用是避免与变量名或数的常量混淆。 串的长度:n 有关概念 空串:零个字符的串称为空串,其长度为零。例如 s = ‘’。
子串:串中任意个连续的字符组成的子序列称为该串的子串,例如 s = ‘abcde’,t = ‘abc’,则 t 是 s 的子串
主串:包含子串的串相应地称为主串,例如 s = ‘abcde’,t = ‘abc’,那么 s 就是 t 的主串
串的位置:字符在序列中的序号称为该字符在串中的位置,例如s = ‘abcde’,字符’ b '在 s 中的位置就是2(在实际应用中为了方便数组操作,也可以从零开始数,则此处就为1)。
而子串在主串中的位置,则用子串的第一个字符在主串中的位置来表示。例如 s = ‘abcde’,t = ‘cd’,子串 t 在 s 中的位置为3。
串相等:只有两个串的长度相等,并且各个对应位置的字符都相等时才称为串相等。例如 s = ‘abc’,t = ‘ab c’,此时 s 和 t 并不相等(空格也属于字符集合中的一个元素)。
空格串:由一个或者多个空格组成的串,称为空格串。例如 s = ’ ',此时 s 串是空格串,但不是空串,其长度为空格的数量。
串的存储结构 回顾线性表的概念:由n(n>=0)个数据特性相同的元素构成的有限序列。
可以发现,同样是有限序列,串的逻辑结构和线性表是很相似的,区别仅在于串的约束对象是字符集。也就是说,假如字符串中存储的是’123456’这么一串,实际上它保存的类型是char,而不是int。
那么,把线性表的存储类型改为char不也能表示串吗?按理来说是这样,但是串与线性表的主要区别是在操作上。在线性表的基本操作中,多以”单个元素“作为操作的对象,例如插入、删除等,多是对某个元素进行操作;而在线性表中,多以“串的整体”作为操作的对象,比如插入,多是插入另一个串,而不是单个字符。因此,串的操作和线性表有很大不同,需要把串当成与线性表不同的逻辑结构来看待。
从存储结构上来说,串也有两种基本的存储结构:顺序存储和链式存储。
顺序存储 有些资料中说,串有三种机内表示方法,分别是定长顺序表示、堆分配存储表示和块链存储表示。实际上,定长顺序表示和堆分配表示都属于顺序存储。
顺序存储的特点是,使用一组地址连续的存储单元来进行存储。我们使用顺序存储结构时,往往需要在一开始去申请一整块的内存空间,然后在我们所申请好的这块内存空间内来插入、删除元素;这样就会出现一个问题:如果这块空间满了,又
————————————————