严蔚敏数据结构-第四章 串
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
S1 4 a b c d S2 2 e f T 6 a b c d e f
15
(2)S1串长 最大串长 串长<最大串长 串长 最大串长; S1,S2串长和 最大串长 串长和>最大串长 串长和 最大串长;
S1 6 a b c d e f S2 6 g h i j k l T 8 a b c d e f g h
3
串的抽象数据类型的定义: 串的抽象数据类型的定义: ADT String{ 数据对象: 数据对象:D={ai|ai∈CharacterSet, i=1,2,...,n, n>=0} 数据关系: 数据关系:R1={<ai-1,ai>|ai-1,ai∈D, i=2,...,n} 基本操作: 基本操作: StrAssign(&T, chars)
11
作业: 作业: 1.用5种串的基本操作(StrAssign、StrCompare、StrLen Concat、SubString)来逻辑实现StrInsert(&S, pos, T)操作 、 操作. )
Status StrInsert(String S, int pos , String T) { if ……….. return error; , , ); ); ); );
chars是字符串常量。生成一个其值等于chars的串 。 是字符串常量。生成一个其值等于 的串T。 是字符串常量 的串
StrCopy(&T, S)
存在则由串S复制得串 串S存在则由串 复制得串 存在则由串 复制得串T
StrEmpty(S)
存在则若S为空串 串S存在则若 为空串 返回真否则返回假 存在则若 为空串,返回真否则返回假
Sub返回串 的第pos个字符起长度为 返回串S的第 个字符起长度为len的子串 用Sub返回串S的第pos个字符起长度为len的子串
Index(S, T, pos)
存在,T非空 若主串S中存 串S和T存在 非空 和 存在 非空,1<=pos<=StrLength(S),若主串 中存 若主串 在和串T值相同的子串 则返回它在主串S中第 值相同的子串,则返回它在主串 中第pos个字符之 在和串 值相同的子串 则返回它在主串 中第 个字符之 后第一次出现的位置,否则函数值为 否则函数值为0 后第一次出现的位置 否则函数值为
StrDelete(&S, pos, len)
存在,1<=pos<=StrLength(S)-len+1从串中删除第 个 从串中删除第pos个 串S存在 存在 从串中删除第 字符起长度为len的子串 字符起长度为 的子串
DestroyString(&S)
存在,则串 串S存在 则串 被销毁 存在 则串S被销毁
}ADT String
6
例子: 例子: 都为串名。 设:S, T, V, a, b, c, d都为串名。 都为串名 a=‘bei’ b=‘jing’ c=‘ ’ d=‘beijing’ (1)StrAssign(&T, chars)和StrCopy(&T, S)赋值操作。 赋值操作。 和 赋值操作 例: StrAssign(S, ‘abcd’) 例: StrCopy(S, d) (2)StrCompare(S, T) 判等函数。 判等函数。 例:StrCompare(a,b) StrCompare(φ, φ) (3)StrLength(S) 求长函数 S=‘abcd’ S=‘beijing’
ClearString(&S)
存在将S清为空串 串S存在将 清为空串 存在将
Concat(&T, S1, S2)
串S1和S2存在用 返回由S1和S2联接而成的新串 和 存在用T返回由 和 联接而成的新串 存在用 返回由
SubString(&Sub, S, pos, len)
存在,1<=pos<=StrLength(S)且0<=len<=StrLength(S)-pos+1 串S存在 存在 且
(1) SubString(Sub1, S, (2)SubString(Sub2, S, (3)Concat(S1, (4)Concat(S, return ok; } , ,
12
4.2 串的表示和实现 4.2.1 定长顺序存储表示 类似于线性表的顺序存储结构,用一组地址连续的存 类似于线性表的顺序存储结构 用一组地址连续的存 储单元存储串值的字符序列. 储单元存储串值的字符序列. 用定长数组表示: 用定长数组表示: #define MAXSTRLEN 255 typedef unsigned char SString[MAXSTRLEN+1]; //0号单元存放串长 号单元存放串长
第四章 串
4.1 串类型的定义 4.2 串的表示和实现 4.3 串的模式匹配算法 4.4 串操作应用举例
1
4.1.1 串的逻辑结构定义 是由零个或多个字符组成的有限序列。 串—— 是由零个或多个字符组成的有限序列。 一般记为: 一般记为:S=‘a1a2…an’ (n>=0) 长度—— 串中字符的数目。 长度 串中字符的数目。 空串—— 零个字符的串,用符号 来表示空串。 空串 零个字符的串,用符号φ来表示空串 来表示空串。 串中任意个连续的字符组成的子序列。 子串—— 串中任意个连续的字符组成的子序列。 子串 主串——包含子串的串。 包含子串的串。 主串 包含子串的串 位置—— 字符在序列中的序号为该字符在串中的位置。 字符在序列中的序号为该字符在串中的位置。 位置 例:a=‘bei’ b=‘jing’ c=‘beijing’ d=‘bei jing’ 的长度分别为: 、 、 、 。 则:a,b,c,d的长度分别为:3、4、7、8。 的长度分别为 a、b是c和d的子串。 的子串。 、 是 和 的子串 a 在c和d中的位置都是 。 中的位置都是1。 和 中的位置都是 2 b在c中的位置是 ,在d中的位置是 中的位置是4, 中的位置是5 在 中的位置是 中的位置是
Replace(&S, T, V)
存在,T非空 替换主串S中出现的所有与 串S,T和V存在 非空 用V替换主串 中出现的所有与 和 存在 非空, 替换主串 中出现的所有与T 相等的不重叠的子串
5
StrInsert(&S, pos, T)
串S和T存在 和 存在,1<=pos<=StrLength(S)+1,在串 的第pos个 在串S的第 个 存在 在串 的第 字符之前插入串T 字符之前插入串
9
(8)StrInsert(&S,pos,T) 插入操作。 插入操作。 if 1≦pos≦StrLength(S)+1 ≦ ≦ 在串S的第 个字符之前插入串T。 的第pos个字符之前插入串 在串 的第 个字符之前插入串 。 else 返回 返回error 例: StrInsert(a,4,b) if a=‘beijing’ (9)StrDelete(&S, pos, len) 删除操作。 删除操作。 1≦pos≦StrLength(S)-len+1 ≦ ≦ 从串S中删除第 个字符起长度为len的子串 中删除第pos个字符起长度为 的子串。 从串 中删除第 个字符起长度为 的子串。 else 返回 返回error 例: StrDelete(d,4,4) d=‘bei’
返回值<0 返回值 返回值=0 返回值
7
(4)Concat(&T, S1, S2) 联接函数。 联接函数。 S2=‘t1t2…tn’ 例 S1=‘S1S2…Sm’ 则: Concat(T, S1, S2) T=‘S1S2…Smt1t2…tn’ Concat(T, S2, S1) T=‘t1t2…tnS1S2…Sm’ (5)SubString(&Sub, S, pos, len) 求子串函数。 求子串函数。
if 1≦pos≦StrLength(S) 且 0 ≦len≦StrLength(S)-pos+1 ≦ ≦ ≦ 返回从串S中第 个字符起, 的字符序列。 用Sub返回从串 中第 个字符起,长度为 的字符序列。 返回从串 中第pos个字符起 长度为len的字符序列 else 返回 返回error
例: SubString(Sub, d, 1, 3) SubString(Sub, d, 4, 0)
13
串长可用下标为0的数组元素存储 也可在串值后设特殊标记 串长可用下标为 的数组元素存储,也可在串值后设特殊标记 的数组元素存储
a[0] 3 a
a[1] a b
a[2] b c
a[3] c \0
a[4]
a[5]
...
a[n] pascal c
14
1.串联接的实现 串联接的实现Concat(&T, S1, S2) 串联接的实现 假设S1,S2和T都是 都是SString型的串变量 且串 是由串 型的串变量,且串 假设 和 都是 型的串变量 且串T是由串 S1联结串 得到的 即串 的值的前一段和串 的值相等 联结串S2得到的 即串T的值的前一段和串 的值相等, 联结串 得到的,即串 的值的前一段和串S1的值相等 的值的后一段和串S2的值相等 则只要进行相应的" 串T的值的后一段和串 的值相等 则只要进行相应的 的值的后一段和串 的值相等,则只要进行相应的 串值复制"操作即可 对超长部分实施"截断 操作即可,对超长部分实施 截断"操作 串值复制 操作即可 对超长部分实施 截断 操作 串可能有三种情况:( )S1,S2串长和 最大值 串长和<=最大值 串可能有三种情况:(1) :( 串长和
StrCompare(S, T)
存在,若 则返回值>0,若 则返回值=0, 串S和T存在 若S>T,则返回值 若S=T,则返回值 和 存在 则返回值 则返回值 则返回值<0 若S<T,则返回值 则返回值
4
StrLength(S)
存在返回S的元素个数称为串的长度 串S存在返回 的元素个数称为串的长度 存在返回 的元素个数称为串的长度.
Sub=‘bei’ Sub=φ
8
(6)Index(S, T, pos) 定位函数。 定位函数。 if 在主串 中的第 个位置之后存在和 相等的子串 在主串S中的第 个位置之后存在和T相等的子串 中的第pos个位置之后存在和 返回S中第一个这样的子串在主串 中的位置。 中第一个这样的子串在主串S中的位置 返回 中第一个这样的子串在主串 中的位置。 else 返回零 例: Index(d,b,1)=4 Index(d,c,1)=0 Index(d,b,5)=0 (7)Replace(&S, T, V) 置换函数。 置换函数。 以串V替换所有出现的和非空串 相等的不重叠的子串。 替换所有出现的和非空串T相等的不重叠的子串 以串 替换所有出现的和非空串 相等的不重叠的子串。 例: Replace(d,b,c) d=‘bei ’ 例:设 S=‘bbabbabba’ T=‘ab’ V=‘c’ 则 Replace(S, T, V) S=‘bbcbcba’ ‘
当两个串的长度相等, 相等—— 当两个串的长度相等,并且各个对应位置的字 相等 符都相等,则称两个串是相等的。 符都相等,则称两个串是相等的。 空格串—— 由一个或多个空格组成的串称为空格串。 空格串 由一个或多个空格组成的串称为空格串。 注意:串值必须用一对单引号括起来,但单引号本身不 注意:串值必须用一对单引号括起来, 属于串。 属于串。 例: x=‘123’; x=123; tsing=‘tsing’
21clearstrings串s存在将s清为空串concatts1s2串s1和s2存在用t返回由s1和s2联接而成的新串substringsubposlen串s存在1posstrlengths且0lenstrlengthspos1用sub返回串s的第pos个字符起长度为len的子串indexspos串s和t存在t非空1posstrlengths若主串s中存在和串t值相同的子串则返回它在主串s中第pos个字符之后第一次出现的位置否则函数值为0replaces用v替换s中出现的所有与t相等的不重叠的子strinsertspos串s和t存在1posstrlengths1在串s的第pos个字符之前插入串tstrdeletesposlen串s存在1posstrlengthslen1从串中删除第pos个字符起长度len的子串destroystrings串s存在则串s被销毁adtstring22其他串操作可以在上述最小操作子集上实现
基本操作: 基本操作:StrAssign、StrCompare、StrLength、 、 、 、 Concat、SubString 、
10
的算法实现: 定位函数 Index(S, T, pos)的算法实现: 的算法实现 算法分析 : S=‘abdgjgutabcdhhuac’ T=‘abc’
int Index(String S, String T, int pos) { if (pos>0) { n=StrLength(S); m=StrLength(T); i=pos; while (i<=n) { SubStrimg(Sub, S, i, m); if ( StrCompare(Sub, T) != 0 ) ++i; else return i; } } return 0; }
15
(2)S1串长 最大串长 串长<最大串长 串长 最大串长; S1,S2串长和 最大串长 串长和>最大串长 串长和 最大串长;
S1 6 a b c d e f S2 6 g h i j k l T 8 a b c d e f g h
3
串的抽象数据类型的定义: 串的抽象数据类型的定义: ADT String{ 数据对象: 数据对象:D={ai|ai∈CharacterSet, i=1,2,...,n, n>=0} 数据关系: 数据关系:R1={<ai-1,ai>|ai-1,ai∈D, i=2,...,n} 基本操作: 基本操作: StrAssign(&T, chars)
11
作业: 作业: 1.用5种串的基本操作(StrAssign、StrCompare、StrLen Concat、SubString)来逻辑实现StrInsert(&S, pos, T)操作 、 操作. )
Status StrInsert(String S, int pos , String T) { if ……….. return error; , , ); ); ); );
chars是字符串常量。生成一个其值等于chars的串 。 是字符串常量。生成一个其值等于 的串T。 是字符串常量 的串
StrCopy(&T, S)
存在则由串S复制得串 串S存在则由串 复制得串 存在则由串 复制得串T
StrEmpty(S)
存在则若S为空串 串S存在则若 为空串 返回真否则返回假 存在则若 为空串,返回真否则返回假
Sub返回串 的第pos个字符起长度为 返回串S的第 个字符起长度为len的子串 用Sub返回串S的第pos个字符起长度为len的子串
Index(S, T, pos)
存在,T非空 若主串S中存 串S和T存在 非空 和 存在 非空,1<=pos<=StrLength(S),若主串 中存 若主串 在和串T值相同的子串 则返回它在主串S中第 值相同的子串,则返回它在主串 中第pos个字符之 在和串 值相同的子串 则返回它在主串 中第 个字符之 后第一次出现的位置,否则函数值为 否则函数值为0 后第一次出现的位置 否则函数值为
StrDelete(&S, pos, len)
存在,1<=pos<=StrLength(S)-len+1从串中删除第 个 从串中删除第pos个 串S存在 存在 从串中删除第 字符起长度为len的子串 字符起长度为 的子串
DestroyString(&S)
存在,则串 串S存在 则串 被销毁 存在 则串S被销毁
}ADT String
6
例子: 例子: 都为串名。 设:S, T, V, a, b, c, d都为串名。 都为串名 a=‘bei’ b=‘jing’ c=‘ ’ d=‘beijing’ (1)StrAssign(&T, chars)和StrCopy(&T, S)赋值操作。 赋值操作。 和 赋值操作 例: StrAssign(S, ‘abcd’) 例: StrCopy(S, d) (2)StrCompare(S, T) 判等函数。 判等函数。 例:StrCompare(a,b) StrCompare(φ, φ) (3)StrLength(S) 求长函数 S=‘abcd’ S=‘beijing’
ClearString(&S)
存在将S清为空串 串S存在将 清为空串 存在将
Concat(&T, S1, S2)
串S1和S2存在用 返回由S1和S2联接而成的新串 和 存在用T返回由 和 联接而成的新串 存在用 返回由
SubString(&Sub, S, pos, len)
存在,1<=pos<=StrLength(S)且0<=len<=StrLength(S)-pos+1 串S存在 存在 且
(1) SubString(Sub1, S, (2)SubString(Sub2, S, (3)Concat(S1, (4)Concat(S, return ok; } , ,
12
4.2 串的表示和实现 4.2.1 定长顺序存储表示 类似于线性表的顺序存储结构,用一组地址连续的存 类似于线性表的顺序存储结构 用一组地址连续的存 储单元存储串值的字符序列. 储单元存储串值的字符序列. 用定长数组表示: 用定长数组表示: #define MAXSTRLEN 255 typedef unsigned char SString[MAXSTRLEN+1]; //0号单元存放串长 号单元存放串长
第四章 串
4.1 串类型的定义 4.2 串的表示和实现 4.3 串的模式匹配算法 4.4 串操作应用举例
1
4.1.1 串的逻辑结构定义 是由零个或多个字符组成的有限序列。 串—— 是由零个或多个字符组成的有限序列。 一般记为: 一般记为:S=‘a1a2…an’ (n>=0) 长度—— 串中字符的数目。 长度 串中字符的数目。 空串—— 零个字符的串,用符号 来表示空串。 空串 零个字符的串,用符号φ来表示空串 来表示空串。 串中任意个连续的字符组成的子序列。 子串—— 串中任意个连续的字符组成的子序列。 子串 主串——包含子串的串。 包含子串的串。 主串 包含子串的串 位置—— 字符在序列中的序号为该字符在串中的位置。 字符在序列中的序号为该字符在串中的位置。 位置 例:a=‘bei’ b=‘jing’ c=‘beijing’ d=‘bei jing’ 的长度分别为: 、 、 、 。 则:a,b,c,d的长度分别为:3、4、7、8。 的长度分别为 a、b是c和d的子串。 的子串。 、 是 和 的子串 a 在c和d中的位置都是 。 中的位置都是1。 和 中的位置都是 2 b在c中的位置是 ,在d中的位置是 中的位置是4, 中的位置是5 在 中的位置是 中的位置是
Replace(&S, T, V)
存在,T非空 替换主串S中出现的所有与 串S,T和V存在 非空 用V替换主串 中出现的所有与 和 存在 非空, 替换主串 中出现的所有与T 相等的不重叠的子串
5
StrInsert(&S, pos, T)
串S和T存在 和 存在,1<=pos<=StrLength(S)+1,在串 的第pos个 在串S的第 个 存在 在串 的第 字符之前插入串T 字符之前插入串
9
(8)StrInsert(&S,pos,T) 插入操作。 插入操作。 if 1≦pos≦StrLength(S)+1 ≦ ≦ 在串S的第 个字符之前插入串T。 的第pos个字符之前插入串 在串 的第 个字符之前插入串 。 else 返回 返回error 例: StrInsert(a,4,b) if a=‘beijing’ (9)StrDelete(&S, pos, len) 删除操作。 删除操作。 1≦pos≦StrLength(S)-len+1 ≦ ≦ 从串S中删除第 个字符起长度为len的子串 中删除第pos个字符起长度为 的子串。 从串 中删除第 个字符起长度为 的子串。 else 返回 返回error 例: StrDelete(d,4,4) d=‘bei’
返回值<0 返回值 返回值=0 返回值
7
(4)Concat(&T, S1, S2) 联接函数。 联接函数。 S2=‘t1t2…tn’ 例 S1=‘S1S2…Sm’ 则: Concat(T, S1, S2) T=‘S1S2…Smt1t2…tn’ Concat(T, S2, S1) T=‘t1t2…tnS1S2…Sm’ (5)SubString(&Sub, S, pos, len) 求子串函数。 求子串函数。
if 1≦pos≦StrLength(S) 且 0 ≦len≦StrLength(S)-pos+1 ≦ ≦ ≦ 返回从串S中第 个字符起, 的字符序列。 用Sub返回从串 中第 个字符起,长度为 的字符序列。 返回从串 中第pos个字符起 长度为len的字符序列 else 返回 返回error
例: SubString(Sub, d, 1, 3) SubString(Sub, d, 4, 0)
13
串长可用下标为0的数组元素存储 也可在串值后设特殊标记 串长可用下标为 的数组元素存储,也可在串值后设特殊标记 的数组元素存储
a[0] 3 a
a[1] a b
a[2] b c
a[3] c \0
a[4]
a[5]
...
a[n] pascal c
14
1.串联接的实现 串联接的实现Concat(&T, S1, S2) 串联接的实现 假设S1,S2和T都是 都是SString型的串变量 且串 是由串 型的串变量,且串 假设 和 都是 型的串变量 且串T是由串 S1联结串 得到的 即串 的值的前一段和串 的值相等 联结串S2得到的 即串T的值的前一段和串 的值相等, 联结串 得到的,即串 的值的前一段和串S1的值相等 的值的后一段和串S2的值相等 则只要进行相应的" 串T的值的后一段和串 的值相等 则只要进行相应的 的值的后一段和串 的值相等,则只要进行相应的 串值复制"操作即可 对超长部分实施"截断 操作即可,对超长部分实施 截断"操作 串值复制 操作即可 对超长部分实施 截断 操作 串可能有三种情况:( )S1,S2串长和 最大值 串长和<=最大值 串可能有三种情况:(1) :( 串长和
StrCompare(S, T)
存在,若 则返回值>0,若 则返回值=0, 串S和T存在 若S>T,则返回值 若S=T,则返回值 和 存在 则返回值 则返回值 则返回值<0 若S<T,则返回值 则返回值
4
StrLength(S)
存在返回S的元素个数称为串的长度 串S存在返回 的元素个数称为串的长度 存在返回 的元素个数称为串的长度.
Sub=‘bei’ Sub=φ
8
(6)Index(S, T, pos) 定位函数。 定位函数。 if 在主串 中的第 个位置之后存在和 相等的子串 在主串S中的第 个位置之后存在和T相等的子串 中的第pos个位置之后存在和 返回S中第一个这样的子串在主串 中的位置。 中第一个这样的子串在主串S中的位置 返回 中第一个这样的子串在主串 中的位置。 else 返回零 例: Index(d,b,1)=4 Index(d,c,1)=0 Index(d,b,5)=0 (7)Replace(&S, T, V) 置换函数。 置换函数。 以串V替换所有出现的和非空串 相等的不重叠的子串。 替换所有出现的和非空串T相等的不重叠的子串 以串 替换所有出现的和非空串 相等的不重叠的子串。 例: Replace(d,b,c) d=‘bei ’ 例:设 S=‘bbabbabba’ T=‘ab’ V=‘c’ 则 Replace(S, T, V) S=‘bbcbcba’ ‘
当两个串的长度相等, 相等—— 当两个串的长度相等,并且各个对应位置的字 相等 符都相等,则称两个串是相等的。 符都相等,则称两个串是相等的。 空格串—— 由一个或多个空格组成的串称为空格串。 空格串 由一个或多个空格组成的串称为空格串。 注意:串值必须用一对单引号括起来,但单引号本身不 注意:串值必须用一对单引号括起来, 属于串。 属于串。 例: x=‘123’; x=123; tsing=‘tsing’
21clearstrings串s存在将s清为空串concatts1s2串s1和s2存在用t返回由s1和s2联接而成的新串substringsubposlen串s存在1posstrlengths且0lenstrlengthspos1用sub返回串s的第pos个字符起长度为len的子串indexspos串s和t存在t非空1posstrlengths若主串s中存在和串t值相同的子串则返回它在主串s中第pos个字符之后第一次出现的位置否则函数值为0replaces用v替换s中出现的所有与t相等的不重叠的子strinsertspos串s和t存在1posstrlengths1在串s的第pos个字符之前插入串tstrdeletesposlen串s存在1posstrlengthslen1从串中删除第pos个字符起长度len的子串destroystrings串s存在则串s被销毁adtstring22其他串操作可以在上述最小操作子集上实现
基本操作: 基本操作:StrAssign、StrCompare、StrLength、 、 、 、 Concat、SubString 、
10
的算法实现: 定位函数 Index(S, T, pos)的算法实现: 的算法实现 算法分析 : S=‘abdgjgutabcdhhuac’ T=‘abc’
int Index(String S, String T, int pos) { if (pos>0) { n=StrLength(S); m=StrLength(T); i=pos; while (i<=n) { SubStrimg(Sub, S, i, m); if ( StrCompare(Sub, T) != 0 ) ++i; else return i; } } return 0; }