计算机数据结构第四章串
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
若S=T,则返回值=0;若S<T,则返回值<0
int comparestr(SString S,SString T) {
int i; for (i=1;i<=s[0]&&i<=t[0];i++)
if(s[i]!=t[i]) return (s[i]-t[i]); return (s[0]-t[0]); }
子串,串中任意个连续的字符组成的子序列称为该 串的子串。
主串,包含子串的串。
位置,字符在序列中的序号为该字符在串中的位置.
例:4个串
a='BEI',b='JING', c='BEIJING',d='BEI JING'
两个串相等,当且仅当这两个串的值相等.
空格串 (blank string,请注意此处不是空串), 由一个或多个空格组成的串''.
StrCompare(S,T) 初始条件:串S和串T存在。 操作结果:若S>T,则返回值>0;若S=T,则返回值=0; 若S<T,则返回值<0。
StrLength(S) 初始条件:串S存在。 操作结果:返回值S的元素个数,称为串的长度。
Concat(&T,S1,S2) 初始条件:串S1和S2存在。 操作结果:用T返回S1和S2联接成的新串。
定长顺序存储结构总结
1.采用此存储结构,实现串操作的原操作 为“字符序列的复制”;操作的时间复 杂度基于复制的字符序列的长度
2.如果在操作中出现串值序列的长度超过 上界MAXSTRLEN时,约定用截尾法处理. 克服这点惟有不限定串的最大长度,即动 态分配串值的存储空间
思考练习:比较二个串,若S>T,则返回值>0;
4.2.2 堆分配存储表示
思想: 仍用一组地址连续的存储单元存储串值的字符序 列,但它们的存储空间是在程序执行过程中动态分配而 得。串的存储空间仍由malloc()函数来分配。 类型定义:
typedef struct{ char *ch; int length;
}HString;
空串,用” ”表示.
2、串的抽象数据类型定义
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) 初始条件:chars是字符串常量。 操作结果:生成一个其值等于chars的串T。
SubString(&Sub,S,pos,len) 初始条件:串S存在,1≤pos≤StrLength(S)且0≤ len ≤StrLength(S)-pos+1 。 操作结果:用Sub返回串S的第pos个字符起长度为 len的子串。
……
} ADT String
4.2 串的表示和实现
4.2.1 定长顺序存储表示 4.2.2 堆分配存储表示 4.2.3 块链存储表示
2.求子串SubString(&Sub,S,pos,len)
初始条件:串S存在, 1≤pos≤StrLength(S)
且 0≤len≤StrLength(S)-pos+1 。 操作结果:用Sub返回串S的第pos个字
符起长度为len的子串。 算法思想:求子串的过程即为复制字符
序列的过程,将串S中从第pos个字符 开始长度为len的字符序列复制到串 Sub中。
第4章 串
4.1 串类型的定义 4.2 串的表示和实现 4.3 模式匹配算法 4.4 串操作应用举例
4.1 串类型的定义
1、名词术语
串(String)(或字符串),是由零个或多个字符组成 的有限序列。一般记做s=‘a1a2…an’(n>=0)
串的长度,串中字符的数目n。
空串(Null string),零个字符的串,它的长度为零。
4.2.1 定长顺序存储表示
思想: 用一组地址连续的存储单元存储串值的字 符序列
#define MAXSTRLEN 255//用户可在255以内定义最大串
长
typedef unsigned char SString[MAXSTRLEN+1]; //0号单元存放串的长度 串的实际长度可在这预定义长度的范围内随意, 超过预定义长度的串值则被舍去,称为“截断”。
基本运算实现
1.串联接Concat(&T,S1,S2)
S1[0]
S2[0]
S1
S2
T
T[0]
MAXSTRLEN
( a ) S1[0]+S2[0]≤MAXSTRLEN
S1[0]
S1
S2[0]
S2
T
S2中被截去的部分
T[0]
MAXSTRLEN
( b ) S1[0]<MAXSTRLEN 而S1[0] +S2[0]>MAXSTRLEN
算法实现
Status SubString(SString &Sub,SString S,int pos,int len)
{ if(pos<1 || pos>S[0] || len<0 || len>S[0]-pos+1) return ERROR; Sub[1..len]=S[pos..pos+len-1]; Sub[0]=len; return OK; }
S1[0]
百度文库
S2[0]
S1
S2
T
S2串全部被截去
T[0]
MAXSTRLEN
( c ) S1[0]=MAXSTRLEN
算法实现
Status Concat(SString &T,SString S1,SString S2){ if (S1[0]+S2[0]<=MAXSTRLEN){ // 未截断
T[1..S1[0]]=S1[1..S1[0]]; T[S1[0]+1..S1[0]+S2[0]]=S2[1..S2[0]]; T[0]=S1[0]+S2[0]; uncut =TRUE;} else if(S1[0]<MAXSTRLEN){ // 截断 T[1..S1[0]]=S1[1..S1[0]]; T[S1[0]+1..MAXSTRLEN]=S2[1..MAXSTRLEN-S1[0]]; T[0]= MAXSTRLEN; uncut =FALSE;} else{ // 截断(仅取S1) T[0 ..MAXSTRLEN]= S1[0 ..MAXSTRLEN]; uncut =FALSE;} return uncut;}
int comparestr(SString S,SString T) {
int i; for (i=1;i<=s[0]&&i<=t[0];i++)
if(s[i]!=t[i]) return (s[i]-t[i]); return (s[0]-t[0]); }
子串,串中任意个连续的字符组成的子序列称为该 串的子串。
主串,包含子串的串。
位置,字符在序列中的序号为该字符在串中的位置.
例:4个串
a='BEI',b='JING', c='BEIJING',d='BEI JING'
两个串相等,当且仅当这两个串的值相等.
空格串 (blank string,请注意此处不是空串), 由一个或多个空格组成的串''.
StrCompare(S,T) 初始条件:串S和串T存在。 操作结果:若S>T,则返回值>0;若S=T,则返回值=0; 若S<T,则返回值<0。
StrLength(S) 初始条件:串S存在。 操作结果:返回值S的元素个数,称为串的长度。
Concat(&T,S1,S2) 初始条件:串S1和S2存在。 操作结果:用T返回S1和S2联接成的新串。
定长顺序存储结构总结
1.采用此存储结构,实现串操作的原操作 为“字符序列的复制”;操作的时间复 杂度基于复制的字符序列的长度
2.如果在操作中出现串值序列的长度超过 上界MAXSTRLEN时,约定用截尾法处理. 克服这点惟有不限定串的最大长度,即动 态分配串值的存储空间
思考练习:比较二个串,若S>T,则返回值>0;
4.2.2 堆分配存储表示
思想: 仍用一组地址连续的存储单元存储串值的字符序 列,但它们的存储空间是在程序执行过程中动态分配而 得。串的存储空间仍由malloc()函数来分配。 类型定义:
typedef struct{ char *ch; int length;
}HString;
空串,用” ”表示.
2、串的抽象数据类型定义
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) 初始条件:chars是字符串常量。 操作结果:生成一个其值等于chars的串T。
SubString(&Sub,S,pos,len) 初始条件:串S存在,1≤pos≤StrLength(S)且0≤ len ≤StrLength(S)-pos+1 。 操作结果:用Sub返回串S的第pos个字符起长度为 len的子串。
……
} ADT String
4.2 串的表示和实现
4.2.1 定长顺序存储表示 4.2.2 堆分配存储表示 4.2.3 块链存储表示
2.求子串SubString(&Sub,S,pos,len)
初始条件:串S存在, 1≤pos≤StrLength(S)
且 0≤len≤StrLength(S)-pos+1 。 操作结果:用Sub返回串S的第pos个字
符起长度为len的子串。 算法思想:求子串的过程即为复制字符
序列的过程,将串S中从第pos个字符 开始长度为len的字符序列复制到串 Sub中。
第4章 串
4.1 串类型的定义 4.2 串的表示和实现 4.3 模式匹配算法 4.4 串操作应用举例
4.1 串类型的定义
1、名词术语
串(String)(或字符串),是由零个或多个字符组成 的有限序列。一般记做s=‘a1a2…an’(n>=0)
串的长度,串中字符的数目n。
空串(Null string),零个字符的串,它的长度为零。
4.2.1 定长顺序存储表示
思想: 用一组地址连续的存储单元存储串值的字 符序列
#define MAXSTRLEN 255//用户可在255以内定义最大串
长
typedef unsigned char SString[MAXSTRLEN+1]; //0号单元存放串的长度 串的实际长度可在这预定义长度的范围内随意, 超过预定义长度的串值则被舍去,称为“截断”。
基本运算实现
1.串联接Concat(&T,S1,S2)
S1[0]
S2[0]
S1
S2
T
T[0]
MAXSTRLEN
( a ) S1[0]+S2[0]≤MAXSTRLEN
S1[0]
S1
S2[0]
S2
T
S2中被截去的部分
T[0]
MAXSTRLEN
( b ) S1[0]<MAXSTRLEN 而S1[0] +S2[0]>MAXSTRLEN
算法实现
Status SubString(SString &Sub,SString S,int pos,int len)
{ if(pos<1 || pos>S[0] || len<0 || len>S[0]-pos+1) return ERROR; Sub[1..len]=S[pos..pos+len-1]; Sub[0]=len; return OK; }
S1[0]
百度文库
S2[0]
S1
S2
T
S2串全部被截去
T[0]
MAXSTRLEN
( c ) S1[0]=MAXSTRLEN
算法实现
Status Concat(SString &T,SString S1,SString S2){ if (S1[0]+S2[0]<=MAXSTRLEN){ // 未截断
T[1..S1[0]]=S1[1..S1[0]]; T[S1[0]+1..S1[0]+S2[0]]=S2[1..S2[0]]; T[0]=S1[0]+S2[0]; uncut =TRUE;} else if(S1[0]<MAXSTRLEN){ // 截断 T[1..S1[0]]=S1[1..S1[0]]; T[S1[0]+1..MAXSTRLEN]=S2[1..MAXSTRLEN-S1[0]]; T[0]= MAXSTRLEN; uncut =FALSE;} else{ // 截断(仅取S1) T[0 ..MAXSTRLEN]= S1[0 ..MAXSTRLEN]; uncut =FALSE;} return uncut;}