青岛理工大学数据结构课件第四章串
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
StrCompare(SubString(S, i, StrLength(T)),T )
?0
i
S串 pos T 串 n-m+1 T 串
int Index (String S, String T, int pos) {
// T为非空串。若主串S中第pos个字符之后存在与 T相等的子串,则返回第一个 这样的子串在S中的位置,否则返回0
最 小 操 作 子 集
串的抽象数据类型定义
StrAssign(&T, chars) 串赋值,生成值为chars的串T chars的串 // 串赋值,生成值为chars的串T StrCompare(S,T) 串比较, S>T,返回值大于0 // 串比较,若S>T,返回值大于0… StrLength(S) 求串长,即返回串S // 求串长,即返回串S中的元素个数 Concat(&T, S1, S2) // 串连接,用T返回S1+S2的新串 串连接, 返回S1 S2的新串 S1+ SubString(&Sub, S, pos, len) // 求S中pos起长度为len的子串 pos起长度为len的子串 起长度为len …… Index(S, T, pos) //子串定位函数(最有价值),返回位置 //子串定位函数(最有价值),返回位置 子串定位函数 ), Replace(&S, T,V) 用子串V替换子串T // 用子串V替换子串T
ClearString (&S) 初始条件:串S存在。 操作结果:将S清为空串。
在上述抽象数据类型定义的13种操作中,
串赋值StrAssign、 串复制 、 串复制Strcopy、 串赋值 、 串比较StrCompare、求串长 串比较 、求串长StrLength、 、 串联接Concat 求子串SubString 串联接 求子串 等六种操作构成串类型的最小操作子集。 等六种操作构成串类型的最小操作子集
′′ 表示空串,空串的长度为零。
StrCompare (S, T) 初始条件: 初始条件:串 S 和 T 存在。 操作结果: 操作结果:若S > T,则返回值 > 0; 若S = T,则返回值 = 0; 若S < T,则返回值 < 0。
例如: 例如:StrCompare(′data′, ′state′) StrCompare(′cat′, ′case′)
s =‘ a1 , a2 , …….. , an’
串值( 括起来) 串名 串值(用‘ ’ 括起来)
(n≥0 )
隐含结束符‘/0 隐含结束符‘/0’ , ASCII码 即ASCII码NUL
为何要单独讨论“ 为何要单独讨论“串”类型? 类型?
字符串操作比其他数据类型更复杂(如拷贝、连接操作) 1) 字符串操作比其他数据类型更复杂(如拷贝、连接操作) 2) 程序设计中,处理对象很多都是串类型。 程序设计中,处理对象很多都是串类型。
StrInsert (&S, pos, T)
初始条件:串S和T存在, 1≤pos≤StrLength(S)+1。 操作结果:在串S的第pos个字符之前 插入串T。
例如:S = ′chater′,T = ′rac′, 例如: 则执行 StrInsert(S, 4, T)之后得到 S = ′character′
SubString(&sub, s, 8, 7)= ‘STUDENT’ SubString(&sub, t, 2, 1)=‘O’ Index(s, ‘A’)= Index( s, t)= 3 0
即:这些操作不可能利用其他串操作来实现 不可能利用其他串操作来实现, 不可能利用其他串操作来实现 反之,其他串操作(除串清除ClearString和串 销毁DestroyString外)可在这个最小操作子 集上实现。
例如,可利用串比较、求串长和求子串等 操作实现定位函数Index(S,T,pos)。 算法的基本思想为: 算法的基本思想为:
} // Index
复习: 复习:C语言中常用的串运算
处理字符串时, 注:用C处理字符串时,要调用标准库函数 #include<string.h> 处理字符串时 串比较:int strcmp(char s1,char s2); 串比较: 求串长: 求串长:int strlen(char s); 串连接: 串连接:char strcat(char to,char from) 子串T定位: 子串T定位:char strchr(char s,char c); // StrCompare(S,T) // StrLength(S) // Concat(&T, S1, S2) // Index(S, pos)
}ADT String
C语言中已有类似串运算函数! 语言中已有类似串运算函数! 语言中已有类似串运算函数
StrAssign (&T, chars)
初始条件:chars 是字符串常量。 操作结果:把 chars 赋百度文库 T 的值。
StrAssign(S, “Data Structure”)
StrCopy (&T, S) 初始条件: 存在。 初始条件:串 S 存在。 操作结果:由串 S 复制得串 T。 操作结果: 。
SubString (&Sub, S, pos, len)
初始条件:
串 S 存在,1≤pos≤StrLength(S) 且0≤len≤StrLength(S)-pos+1。
操作结果:
用 Sub 返回串 S 的第 pos 个字符起 长度为 len 的子串。
子串为“ 子串为“串” 中的一个字符子序列 例如: 例如: SubString( sub, ′commander′, 4, 3) ′ 求得 sub = ′man′ ; ′ SubString( sub, ′commander′, 1, 9) ′ 求得 sub = ′commander′; ′ SubString( sub, ′commander′, 9, 1) ′ 求得 sub = ′r′; ′
StrDelete (&S, pos, len) 初始条件:串S存在 1≤pos≤StrLength(S)-len+1。 操作结果:从串S中删除第pos个字符 起长度为len的子串。 赋值 StrAssign(S, “Data Structure”)
子串删除 StrDelete(S, 3, 5) // “Daructure”
第4 章
1. 定义 2. 逻辑结构 3. 存储结构 4. 运算规则 5. 实现方式
串(String) String)
4.1 4.2 串类型的定义 串的表示和实现
4.1
串类型的定义
串即字符串,是由零个或多个字符组成的有限序列,是数据 即字符串,是由零个或多个字符组成的有限序列, 有限序列 元素为单个字符的特殊线性表。 元素为单个字符的特殊线性表。 的特殊线性表 记为: 记为:
例: 赋值 StrAssign(S, “Data Structure”)
子串置换 Replace(S, “a”, “b”) // S为“Dbtb Structure” 假设 S = ′abcaabcaaabca′,T = ′bca′ 若 V = ′x′, 则经置换后得到 S = ′axaxaax′ 若 V = ′bc′, 则经置换后得到 S = ′abcabcaabc′
gets(str) 输入一个串; puts(str) 输出一个串; strcpy(str1, str2, k) 串复制函数;
=’I 设 s =I q=’WORKER WORKER’。 q= WORKER 。求: 练习: 练习: StrLength(s) = StrLength(t) =
AM 14 4
假设 S = ′abcaabcaaabc′, T = ′bca′ Index(S, T, 1) = 2; Index(S, T, 3) = 6; Index(S, T, 8) = 0;
Replace (&S, T, V)
初始条件:串S, T和 V 均已存在,且 T 是非空串。 操作结果:用V替换主串S中出现的所有与(模式串)T 相等的 不重叠的子串。
<0 >0
StrLength (S) 初始条件:串 S 存在。 操作结果:返回 S 的元素个数, 称为串的长度。
Concat (&T, S1, S2) 初始条件:串 S1 和 S2 存在。 操作结果:用 T 返回由 S1 和 S2 联接而成的新串。
例如: 例如 Concat( T, ′man′, ′kind′) 求得 T = ′mankind′
A
STUDENT’, =’GOOD GOOD’, STUDENT , t = GOOD , Index(S, T, pos) 返回子串T // 返回子串T在pos 之后的位置 Replace(&S, T,V) 用子串V替换子串T // 用子串V替换子串T 中没有t=’GOOD’ !) ( s中没有 中没有
Index (S, T, pos)
初始条件: 初始条件:串S和T存在,T是非空串,1≤pos≤StrLength(S)。 条件 操作结果: 操作结果: 若主串 S 中存在和串 T 值相同的子串, 则返回它 返回它 中第pos个字符之后第一次出现的位置 个字符之后第一次出现的位置;否则函数 在主串 S 中第 个字符之后第一次出现的位置 值为0。
ADT String{ Objects: D={ai | ai∈CharacterSet, i=1, 2,…,n, n≥0} , Relations: R1={<ai-1,ai> | ai-1,ai ∈D, i=2, …,n} , functions: //至少有13种基本操作 至少有13 //至少有13种基本操作
if (pos > 0) { n = StrLength(S); m = StrLength(T); i = pos; while ( i <= n-m+1) { SubString (sub, S, i, m); if (StrCompare(sub,T) != 0) ++i ; else return i ; } // while } // if return 0; // S中不存在与T相等的子串
空串和空白串有 无区别? 无区别?
串长: 串中字符的个数(n≥0) 串长: 串中字符的个数(n≥0). n=0 时称为空串 ∅ 。 时称为空串 空白串: 由一个或多个空格符组成的串。 空白串: 由一个或多个空格符组成的串。 空格符组成的串 子串: 子串:串S中任意个连续的字符序列叫S的子串; S叫主串。 任意个连续的字符序列叫 的子串; S叫主串。 序列叫S 子串位置:子串的第一个字符在主串中的序号。 子串位置:子串的第一个字符在主串中的序号。 有区别。 有区别。 字符位置:字符在串中的序号。 是指长度为零的串; 字符位置:字符在串中的序号。 是指长度为零的串; 空串(Null String)是指长度为零的串 空串(Null String) 串相等:串长度相等,且对应位置上字符相等。 串相等:串长度相等(Blank String),是指包含一个或多个空 而空白串(Blank String),是指包含一个或多个空 而空白串,且对应位置上字符相等。 白字符‘ 空格键)的字符串. 白字符‘ ’(空格键)的字符串. 个字符串: 例1:现有以下 个字符串: :现有以下4个字符串 a =‘BEI’ b =‘JING’ c = ‘BEIJING’ d = ‘BEI JING’ 他们各自的长度? =3, =4, 7, 问:① 他们各自的长度? a =3,b =4,c = 7,d=8 是哪个串的子串? ② a是哪个串的子串?在主串中的位置是多少? 是哪个串的子串 在主串中的位置是多少? a是c和d的子串,在c和d中的位置都是 是 和 的子串 的子串, 和 中的位置都是 中的位置都是1 是哪个串的子串? ③ b是哪个串的子串?在主串中的位置是多少? 是哪个串的子串 在主串中的位置是多少?
StrAssign(S, “Data Structure”) StrCopy(T, S) // T为“Data Structure” 为
DestroyString (&S)
初始条件:串 S 存在。 操作结果:串 S 被销毁。
StrEmpty (S) 初始条件:串S存在。 操作结果:若 S 为空串,则返回TRUE, 否则返回 FALSE。
?0
i
S串 pos T 串 n-m+1 T 串
int Index (String S, String T, int pos) {
// T为非空串。若主串S中第pos个字符之后存在与 T相等的子串,则返回第一个 这样的子串在S中的位置,否则返回0
最 小 操 作 子 集
串的抽象数据类型定义
StrAssign(&T, chars) 串赋值,生成值为chars的串T chars的串 // 串赋值,生成值为chars的串T StrCompare(S,T) 串比较, S>T,返回值大于0 // 串比较,若S>T,返回值大于0… StrLength(S) 求串长,即返回串S // 求串长,即返回串S中的元素个数 Concat(&T, S1, S2) // 串连接,用T返回S1+S2的新串 串连接, 返回S1 S2的新串 S1+ SubString(&Sub, S, pos, len) // 求S中pos起长度为len的子串 pos起长度为len的子串 起长度为len …… Index(S, T, pos) //子串定位函数(最有价值),返回位置 //子串定位函数(最有价值),返回位置 子串定位函数 ), Replace(&S, T,V) 用子串V替换子串T // 用子串V替换子串T
ClearString (&S) 初始条件:串S存在。 操作结果:将S清为空串。
在上述抽象数据类型定义的13种操作中,
串赋值StrAssign、 串复制 、 串复制Strcopy、 串赋值 、 串比较StrCompare、求串长 串比较 、求串长StrLength、 、 串联接Concat 求子串SubString 串联接 求子串 等六种操作构成串类型的最小操作子集。 等六种操作构成串类型的最小操作子集
′′ 表示空串,空串的长度为零。
StrCompare (S, T) 初始条件: 初始条件:串 S 和 T 存在。 操作结果: 操作结果:若S > T,则返回值 > 0; 若S = T,则返回值 = 0; 若S < T,则返回值 < 0。
例如: 例如:StrCompare(′data′, ′state′) StrCompare(′cat′, ′case′)
s =‘ a1 , a2 , …….. , an’
串值( 括起来) 串名 串值(用‘ ’ 括起来)
(n≥0 )
隐含结束符‘/0 隐含结束符‘/0’ , ASCII码 即ASCII码NUL
为何要单独讨论“ 为何要单独讨论“串”类型? 类型?
字符串操作比其他数据类型更复杂(如拷贝、连接操作) 1) 字符串操作比其他数据类型更复杂(如拷贝、连接操作) 2) 程序设计中,处理对象很多都是串类型。 程序设计中,处理对象很多都是串类型。
StrInsert (&S, pos, T)
初始条件:串S和T存在, 1≤pos≤StrLength(S)+1。 操作结果:在串S的第pos个字符之前 插入串T。
例如:S = ′chater′,T = ′rac′, 例如: 则执行 StrInsert(S, 4, T)之后得到 S = ′character′
SubString(&sub, s, 8, 7)= ‘STUDENT’ SubString(&sub, t, 2, 1)=‘O’ Index(s, ‘A’)= Index( s, t)= 3 0
即:这些操作不可能利用其他串操作来实现 不可能利用其他串操作来实现, 不可能利用其他串操作来实现 反之,其他串操作(除串清除ClearString和串 销毁DestroyString外)可在这个最小操作子 集上实现。
例如,可利用串比较、求串长和求子串等 操作实现定位函数Index(S,T,pos)。 算法的基本思想为: 算法的基本思想为:
} // Index
复习: 复习:C语言中常用的串运算
处理字符串时, 注:用C处理字符串时,要调用标准库函数 #include<string.h> 处理字符串时 串比较:int strcmp(char s1,char s2); 串比较: 求串长: 求串长:int strlen(char s); 串连接: 串连接:char strcat(char to,char from) 子串T定位: 子串T定位:char strchr(char s,char c); // StrCompare(S,T) // StrLength(S) // Concat(&T, S1, S2) // Index(S, pos)
}ADT String
C语言中已有类似串运算函数! 语言中已有类似串运算函数! 语言中已有类似串运算函数
StrAssign (&T, chars)
初始条件:chars 是字符串常量。 操作结果:把 chars 赋百度文库 T 的值。
StrAssign(S, “Data Structure”)
StrCopy (&T, S) 初始条件: 存在。 初始条件:串 S 存在。 操作结果:由串 S 复制得串 T。 操作结果: 。
SubString (&Sub, S, pos, len)
初始条件:
串 S 存在,1≤pos≤StrLength(S) 且0≤len≤StrLength(S)-pos+1。
操作结果:
用 Sub 返回串 S 的第 pos 个字符起 长度为 len 的子串。
子串为“ 子串为“串” 中的一个字符子序列 例如: 例如: SubString( sub, ′commander′, 4, 3) ′ 求得 sub = ′man′ ; ′ SubString( sub, ′commander′, 1, 9) ′ 求得 sub = ′commander′; ′ SubString( sub, ′commander′, 9, 1) ′ 求得 sub = ′r′; ′
StrDelete (&S, pos, len) 初始条件:串S存在 1≤pos≤StrLength(S)-len+1。 操作结果:从串S中删除第pos个字符 起长度为len的子串。 赋值 StrAssign(S, “Data Structure”)
子串删除 StrDelete(S, 3, 5) // “Daructure”
第4 章
1. 定义 2. 逻辑结构 3. 存储结构 4. 运算规则 5. 实现方式
串(String) String)
4.1 4.2 串类型的定义 串的表示和实现
4.1
串类型的定义
串即字符串,是由零个或多个字符组成的有限序列,是数据 即字符串,是由零个或多个字符组成的有限序列, 有限序列 元素为单个字符的特殊线性表。 元素为单个字符的特殊线性表。 的特殊线性表 记为: 记为:
例: 赋值 StrAssign(S, “Data Structure”)
子串置换 Replace(S, “a”, “b”) // S为“Dbtb Structure” 假设 S = ′abcaabcaaabca′,T = ′bca′ 若 V = ′x′, 则经置换后得到 S = ′axaxaax′ 若 V = ′bc′, 则经置换后得到 S = ′abcabcaabc′
gets(str) 输入一个串; puts(str) 输出一个串; strcpy(str1, str2, k) 串复制函数;
=’I 设 s =I q=’WORKER WORKER’。 q= WORKER 。求: 练习: 练习: StrLength(s) = StrLength(t) =
AM 14 4
假设 S = ′abcaabcaaabc′, T = ′bca′ Index(S, T, 1) = 2; Index(S, T, 3) = 6; Index(S, T, 8) = 0;
Replace (&S, T, V)
初始条件:串S, T和 V 均已存在,且 T 是非空串。 操作结果:用V替换主串S中出现的所有与(模式串)T 相等的 不重叠的子串。
<0 >0
StrLength (S) 初始条件:串 S 存在。 操作结果:返回 S 的元素个数, 称为串的长度。
Concat (&T, S1, S2) 初始条件:串 S1 和 S2 存在。 操作结果:用 T 返回由 S1 和 S2 联接而成的新串。
例如: 例如 Concat( T, ′man′, ′kind′) 求得 T = ′mankind′
A
STUDENT’, =’GOOD GOOD’, STUDENT , t = GOOD , Index(S, T, pos) 返回子串T // 返回子串T在pos 之后的位置 Replace(&S, T,V) 用子串V替换子串T // 用子串V替换子串T 中没有t=’GOOD’ !) ( s中没有 中没有
Index (S, T, pos)
初始条件: 初始条件:串S和T存在,T是非空串,1≤pos≤StrLength(S)。 条件 操作结果: 操作结果: 若主串 S 中存在和串 T 值相同的子串, 则返回它 返回它 中第pos个字符之后第一次出现的位置 个字符之后第一次出现的位置;否则函数 在主串 S 中第 个字符之后第一次出现的位置 值为0。
ADT String{ Objects: D={ai | ai∈CharacterSet, i=1, 2,…,n, n≥0} , Relations: R1={<ai-1,ai> | ai-1,ai ∈D, i=2, …,n} , functions: //至少有13种基本操作 至少有13 //至少有13种基本操作
if (pos > 0) { n = StrLength(S); m = StrLength(T); i = pos; while ( i <= n-m+1) { SubString (sub, S, i, m); if (StrCompare(sub,T) != 0) ++i ; else return i ; } // while } // if return 0; // S中不存在与T相等的子串
空串和空白串有 无区别? 无区别?
串长: 串中字符的个数(n≥0) 串长: 串中字符的个数(n≥0). n=0 时称为空串 ∅ 。 时称为空串 空白串: 由一个或多个空格符组成的串。 空白串: 由一个或多个空格符组成的串。 空格符组成的串 子串: 子串:串S中任意个连续的字符序列叫S的子串; S叫主串。 任意个连续的字符序列叫 的子串; S叫主串。 序列叫S 子串位置:子串的第一个字符在主串中的序号。 子串位置:子串的第一个字符在主串中的序号。 有区别。 有区别。 字符位置:字符在串中的序号。 是指长度为零的串; 字符位置:字符在串中的序号。 是指长度为零的串; 空串(Null String)是指长度为零的串 空串(Null String) 串相等:串长度相等,且对应位置上字符相等。 串相等:串长度相等(Blank String),是指包含一个或多个空 而空白串(Blank String),是指包含一个或多个空 而空白串,且对应位置上字符相等。 白字符‘ 空格键)的字符串. 白字符‘ ’(空格键)的字符串. 个字符串: 例1:现有以下 个字符串: :现有以下4个字符串 a =‘BEI’ b =‘JING’ c = ‘BEIJING’ d = ‘BEI JING’ 他们各自的长度? =3, =4, 7, 问:① 他们各自的长度? a =3,b =4,c = 7,d=8 是哪个串的子串? ② a是哪个串的子串?在主串中的位置是多少? 是哪个串的子串 在主串中的位置是多少? a是c和d的子串,在c和d中的位置都是 是 和 的子串 的子串, 和 中的位置都是 中的位置都是1 是哪个串的子串? ③ b是哪个串的子串?在主串中的位置是多少? 是哪个串的子串 在主串中的位置是多少?
StrAssign(S, “Data Structure”) StrCopy(T, S) // T为“Data Structure” 为
DestroyString (&S)
初始条件:串 S 存在。 操作结果:串 S 被销毁。
StrEmpty (S) 初始条件:串S存在。 操作结果:若 S 为空串,则返回TRUE, 否则返回 FALSE。