串的逻辑结构和线性表很相似,不同之处在于串针对的是字符集,也就是串中的元素都是字符,哪怕串中的字符是“123”这样的数字组成,或者“2010-10-1CT这 样的日期组成,它们都只能理解为长度为3和长度为10的字符串,每个元素都是字符而已。
因此,对于串的基本操作与线性表是有很大差别的。线性表更关注的是单个元素的操作,比如査找一个元素,插入或删除一个元素,但串中更多的是査找子串位置、得到指定位置子串、替换子串等操作。
为了更加深入地了解串这个数据结构,我们需要定义串的ADT,然后再实现串的一些常见操作。串的ADT定义如下:
ADT 串 (String) Data 串中的元素仅由一个字符组成,相邻元素具有前驱和后继关系. Operation StrAssign (&T, chars) 初始条件:chars是字符串常量。 操作结果:生成一个其值等于chars的串T。 StrCopy (&T, S) 初始条件:串S存在。 操作结果:由串S复制得串T。 StrEmpty(S) 初始条件:串S存在。 操作结果:若S为空串,则返回TRUE,否则返回FALSE。 StrCompare(S, T) 初始条件:串S和T存在。 操作结果:若S>T,则返回值>0;若S=T,则返回值=0;若S < T,则返回值 < 0。 StrLength(S) 初始条件:串S存在。 操作结果:返回S的元素个数,称为串的长度。 ClearString (&S) 初始条件:串S存在。 操作结果:将S清为空串。 Concat (&T, S1, S2) 初始条件:串S1和S2存在。 操作结果:用T返回由S1和S2联接而成的新串。 SubString(&Sub, S, pos, len) 初始条件:串S存在,1≤pos≤StrLength(S)且0≤len≤StrLength(S)-pos+1 操作结果:用Sub返回串S的第pos个字符长度为len的子串。 Index(S, T, pos) 初始条件:串S和T存在,T是非空串,1≤pos≤StrLength(S)。 操作结果:若主串S中存在和串T值相同的子串,则返回它在主串S中第pos个字符之后第一次出现的位置;否则函数值为0。 Replace (&S, T, V) 初始条件:串S, T和V存在,T是非空串。 操作结果:用V替换主串S中出现的所有与T相等的不重叠的子串。 StrInsert (&S, pos, T) 初始条件:串S和T存在, 1≤pos≤StrLength(S)+1。 操作结果:在串S的第pos个字符之前插入串T。 StrDelete (&S, pos, len) 初始条件:串S存在, 1≤pos≤StrLength(S)-len+1。 操作结果:从串S中删除第pos个字符起长度为len的子串。 DestroyString (&S) 初始条件:串S存在。 操作结果:串S被销毁。 endADT
以下5个操作称为最小操作子集:
- 串赋值StrAssign
- 串比较StrCompare
- 求串长StrLength
- 串联接Concat
- 求子串SubString
-
在上述抽象数据类型定义的13种操作中,这5种操作不可能利用其他串操作来实现,但其他串操作均可在这个最小操作子集上实现。
延伸阅读
此文章所在专题列表如下:
- 数据结构里的串是什么东西?
- 如何比较串的大小
- 串的抽象数据类型ADT
- 串的顺序存储结构
- 串最基本的5个操作的C实现
- 寻找子串在主串中的位置
- 如何在串中插入串
- 如何在串中删除特定长度的子串
- 字符串中的子串替换
- 题外话:谈谈malloc()和free()
本文地址:http://www.nowamagic.net/librarys/veda/detail/2403,欢迎访问原出处。