第四章串ppT
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
例: Lstring S; s.head s.tail s.curlen 5
a b
c d
e # ^
22
串块链结构结点大小的选择依据:
存储密度= 例: 串值所占的存储位
实际分配的存储位
head head
a b c d
e f g h
i # # # ^
a
b = 3 5
c
…
i ^
= 1 2
23
9 存储密度= 15
21
块链结构串的C表示: #define CHUKSIZE 80 Typedef struct chunk { char ch[CHUKSIZE]; struct chunk *next; }chunk; Typedef struct { chunk *head,*tail; Int curlen; }Lstring;
9 存储密度= 18
4.3 串的模式匹配算法
定位函数 index(s,t,pos)的算法实现: 算法分析 : S=‘abdgjgutabcdhhuac’
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;
}
11
用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 5 相等的不重叠的子串
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)S1串长已=最大串长;
S1 8 a b c d e f g h
基本操作:strassign、strcompare、strlength、
concat、substring
10
定位函数 index(s,t,pos)的算法实现: 算法分析 : S=‘abdgjgutabcdhhuac’
Int index (string s,string t,int pos) {
t=‘abc’
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; }
18
※4.2.2 堆分配存储表示
这种存储表示的特点是,仍以一组地址连续的存储单 元存放串值字符序列,但它们的存储空间是在程序执行过 程中动态分配而得。在C语言中,存在一个称之为堆的自由 存储区,并由C语言的动态分配函数malloc()和free()来管理. 利用函数malloc()为每个新产生的串分配一块实际串长所 需存储空间,为处理方便,约定串长也作为存储结构的一部分。 堆分配的存储表示: typedef struct{ char *ch; int length; }HString;
8
(6)index(s,t,pos) 定位函数。 if 在主串S中的第pos个位置之后存在和t相等的子串 返回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’
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)
if 1≦pos≦length(s) 且 0 ≦len≦length(s)-pos+1 用sub返回从串s中第pos个字符起,长度为len的字符序列。 else 返回error
例: substring(sub,d,1,3) Sub=‘bei’ Substring(sub,d,4,0) sub=φ
7
S=‘ abcd’ S=‘beijing’
(4)concat(&t,s1,s2) 联接函数。
例 S1=‘S1S2…Sm’ s2=‘t1t2…tn’ 则: concat(t,s1,s2) t=‘S1S2…Smt1t2…tn’ concat(t,s2,s1) t=‘t1t2…tnS1S2…Sm’ (5)substring(&sub,s,pos,len) 求子串函数。
第四章 串
4.1 串类型的定义 4.2 串的表示和实现 4.3 串的模式匹配算法
4.4 串操作应用举例
1
4.1.1 串的逻辑结构定义 串—— 是由零个或多个字符组成的有限序列。 一般记为:S=‘a1a2…an’ (n>=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的值相等, 串T的值的后一段和串S2的值相等,则只要进行相应的" 串值复制"操作即可,对超长部分实施"截断"操作 串可能有三种情况:(1)S1,S2串长和<=最大值
主串——包含子串的串。 位置—— 字符在序列中的序号为该字符在串中的位置。 例: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中的位置是4,在d中的位置是5
chars是字符常量。生成一个其值等于chars的串T。
StrCopy(&T,S)
串S存在则由串S复制得串T
StrEmpty(S)
串S存在则若S为空串,返回真否则返回假
百度文库
StrCompare(S,T)
串S和T存在,若S>T,则返回值>0,若S=T,则返回值=0, 若S<T,则返回值<0
4
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
串S存在,则串S被销毁
}ADT String
6
例子: 设:s,t,v,a,b,c,d都为串名。 a=‘bei’ b=‘jing’ c=‘ ’ d=‘beijing’ (1)Strassign(&s,ss)和strcopy(&s,t)赋值操作。
例: strassign(s, ‘abcd’) 例: strcopy(s, d) (2)strcompare(s,t) 判等函数。 例:strcompare(a,b) strcompare(φ, φ) (3)strlength(s) 求长函数 返回值<0 返回值=0
19
ADT string 的堆分配存储的表示和实现:
堆分配存储的表示; 基本操作的函数原型说明; P76~77
基本操作的算法描述;
20
4.2.3 串的块链存储表示
例: s=‘abcdefghi’
head a b c d e f g h i # # # ^
head
a
b
c
…
i ^
为了便于进行串的操作,当以链表存储串值时,除 头指针外还可附设一个尾指针指示链表的最后一个结点, 并给出当前串的长度,称如此定义的串存储结构为块链结构。
S2 2 i j
T 8 a b c d e f g h
16
算法描述如下: 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]<MAXSTRSIZE){ T[1..S1[0]]=S1[1..S1[0]]; T[S1[0]+1..MAXSTRLEN]=S2[1..MAXSTRLEN-S1[0]]; T[0]=MAXSTRLEN; uncut=FALSE; } else{ T[0..MAXSTRLEN]=S1[0..MAXSTRLEN]; uncut=FALSE; } return uncut; }
作业: substring)来逻辑实现strinsert(&s,pos,t)操作.
1.用5种串的基本操作(strassign、strcompare、strlength、 concat、
Status strinsert(string s,int pos ,string t) { if ……….. Return error; , , ); );
17
2.求子串substring(&sub,S,pos,len)
if 1≦pos≦length(s) 且 0 ≦len≦length(s)-pos+1 用sub返回从串s中第pos个字符起,长度为len的字符序列。 else 返回error
Status substring(sstring &sub,sstring s,int pos,int len){
(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号单元存放串长
9
(8)strsert(&s,pos,t) 插入操作。 if 1≦pos≦length(s)+1 在串S的第pos个字符之前插入串t。 else 返回error 例: strinsert(a,4,b) (9)strdelete(&s,pos,len) 删除操作。 if 1≦pos≦length(s)-len+1 从串S中删除第pos个字符起长度为len的子串。 else 返回error 例: strdelete(a,4,4) a=‘bei’ a=‘beijing’
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从串中删除第pos个 字符起长度为len的子串
DestroyString(&S)