ImageVerifierCode 换一换
格式:DOCX , 页数:37 ,大小:113.53KB ,
资源ID:9825274      下载积分:2 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/9825274.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(《第4章串》习题解答docx.docx)为本站会员(b****7)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

《第4章串》习题解答docx.docx

1、第4章串习题解答docx本章学习要点熟悉串的相关概念以及串与线性表的关系重点掌握串的定长存储、堆分配存储的表示方法与基本操作的实现 了解串的各种存储结构,能根据需要合理选用串的存储结构解决实际问题“串” (string),是字符串的简称,它是一种特殊的线性表,其特殊性在于组成线性表的数 据元素是单个字符,并且在串的各种基本操作中都是以串(或子串)作为操作对象。字符串 在计算机处理实际问题中使用非常广泛,比如人名、地名、商品名、设备名等均为字符串。 同样在文字编辑、自然语言理解和翻译、源程序的编辑和修改等方面,都离不开对字符串的 处理。4.1串的基本概念4.1.1串的概念1.串的定义串(stri

2、ng)是由n个字符组成的有限序列,记为:S=aoa1a2.an.1 (n0)o其中,S是串的名字,字符序列aoa1a2.an.1是串的值,务(0主ml)可以是字母、数字或其他字 符元素;由于在C语言系统中数组元素的下标是从0开始的,所以串屮所含元素的序号等于 该元素的下标值加1 ;串屮所含字符的个数n称为该串的长度,长度为0的字符串称为空串(nullstring) o从串的定义可以看出,串实际上是数据元素为字符的特殊的线性表。(长度为4的串)(长度为11的串)(长度为8的串)(长度为0的空串) (长度为16的串)(长度为6的串)例如:(1)A=“X123(2)B=“l2345654321”(3

3、)C=“BeiJing(4)D=“(5)E=“This is a string(6)F=isa2.子串、主串和位置串屮任意连续的字符纽成的子序列称为该串的子串;相应地,包含子串的串称为主串。 串中的字符在串序列中的序号称为该字符在该串中的位置;子串的第一个字符在主串中的位 瓷称为子串在主串中的位置。显然,串为其B身的子串,并规定空串为任何串的子串。显然, 在不考虑空子冷的情况下,一个长度为n的字符串具有n(n+l)/2个子串。例如:在上例的(6)中串F就是(5)中串E的子串,且子串F在主串E中的位置是5。由于空格符 也是一个字符,所以在串G=“abc defghneT|包含有子串tuc def

4、而串“cdef,不是串G的子串。 串G中第一个字符的位置是6,笫二个字符的位置是Ik3.串的比较如來两个串的长度相等且对应位置上的字符相同,则称这两个串相等。两个串A、B的比较过程是:从前往后逐个比较对应位置上的字符的ASCII码值,直到不相等或有一个字符串 结束为止,此时的情况有以下几种:(1)两个串同时结束,表示A等于B;(2)A中字符的ASCII码值人于B小相应位査上字符的ASCII码值或B串结束,表示A 大于B;(3)B中字符的ASCII码值大于A中相应位置上字符的ASCII码值或A串结束,表示A 小于Bo例如:“abc=“abc , “abcv“abcd, “abxy“abcdefg

5、, T32T 23456, “ABabv“abAB, “3+2,“2+3”。4.空格串由一个或多个空格字符组成的串称为空格串,空格串的长度为串中所含空格字符的个数。 在串操作中不要将空格串和空串混淆。4.1.2串的基本操作尽管串的定义和线性表极为和似,但是串的基本操作和线性表有很大差別。在线性表的 基木操作屮,人多以单个元素作为操作对象,比如对线性表的查找、访问、插入、删除和排 序等;而在串的基本操作中,通常以串整体或串的一部分(子串)作为操作对象,比如子串 的查找、截取子串、删除一个子串、插入子串和子串替换等操作。串的基本操作主要有:(1)初始化串StrAssign(&T,chars)由字符

6、串常量chars生成字符串T的操作。(2)串复制StrCopy(&T,S)由串S复制主成串T的操作。(3)串比较StrCompare(S,T)若S=T返冋0, ST返回正数,ST返冋负数。(4)求串长度StrLength(S)返回串S的长度。(5)串连接Concat(&T,Sl,S2)将串S1和S2连接起來生成串T的操作。(6)求子串SubString(&Sub,S,pos,len)以串S中pos位置开始的len个字符生成子串Sub 的操作。(7)串查找Index(S,T,pos)返回子串T在S中pos个字符以后出现的位置。(8)串替换Replace(&S,T,V)将串S中所有不重叠子串T替换

7、为串V的操作。(9)串插入Strlnsert(&S,pos,T)在串S中笫pos个字符前插入串T的操作。(10)删除子串StrDelete(&S,pos,len)删除串S屮笫pos个字符开始的len个字符的操作。4.2串的存储表示与实现既然串是线性表的特例,所以线性表的两种存储结构对于串也是适用的。在应用小具体 选用何种存储结构与串的操作有关,比如对串进行插入和删除操作运算时选用链存储结构较 好,对串进行查找和求了串运算时选用顺序存储结构较好。本章主要介绍串的3种存储表示方法:(1)串的定长顺序存储表示法(2)串的堆分配存储表示法(3)串的块链式存储表示法4.2.1串的定长顺序存储表示串的定长

8、顺序存储表示是用一组地址连续的存储单元来存储串屮的字符序列。在串的定 长顺序存储表示屮,按照预定义的大小,为每个定长的串变量分配一个固定长度的存储区, 所以nJ以用定长字符数组来表示。1.定长顺序存储结构在C+运行环境中,定长顺序结构定义为:#includeniostream.hn定义审的最大长度为255/定义定长顺序存储类型SString#includestdio.h#detme MAXLEN 255 typcdcf char SStringMAXLEN+l;2.基本操作的C+程序实现(1 )求串长度操作 int Lcngth_SS(SString S)操作返回串s中所含字符的个数,即串的长

9、度;如果S为空串则返回0。int Length SS(SString S) int i=0;whilc(Si)i+;return(i);(2 )串连接操作 int Concat_SS(SString &T,SString SI,SString S2)该操作将冷SI、S2连接生成g T,如果在连接过程中产生了截断(即S1的长度加上S2 的长度大于MAXLEN)则返回0,否则返回1。int Concat_SS(SString &T,SString SI,SString S2)int i j,k;i=j=k=0;while(Ti+=Slj+);i;while(iMAXLEN&(Ti=S2k) i+;

10、k+; Ti=0;if(i=MAXLEN)&S2k) rctum(O); /*判断是否产生截断*/else retum(l);(3 )求子串操作 int SubString_SS(SString &Sub,SString S,int pos,int len)该操作截収冷S中从笫pos个字符开始的连续的len个字符生成子串Sub,如果位置pos 和长度len合理则返回1,否则返回0.int SubString_SS(SString &Sub,SString S,int pos,int len)int i=0;if(posl|lenLength_SS(S)4-l) return 0; /*判断位置

11、和长度是否合理*/whilc(ilcn) Subi=Si+pos-l; i+;Subi=*0:return 1;(4 )初始化串操作 int StrAssign SS(SString &T,char *s)该操作用字符数组s,初始化定长顺序串T。如果不产生截断(长度合理)返冋1,否则 返回0。int StrAssign SS(SString &T,char *s)int i=0;while(iT则返回正数,如果S=T则返回0,否则返回负数。 int StrComparc_SS(SString S,SString T)int i=0;while(Si&Ti&(Si=Ti)i+;return (i

12、nt)(Si-Ti);(7 )串的替换操作 int Replace_SS(SString &S,int n,int m,SString T)该操作将串S中从第n个字符开始的连续的m个字符替换成串T中的字符,如果n和m 的选取合理则返回1,否则返回0。int Replace_SS(SString &S,int n,int m,SString T)SString SI;int len=Length SS(T);int i=n-l j=O,k=n+m-l;/*i为开始普换位置,j指向第一个普换字符,k为剩余字符的开始位置if(nl |mLength_SS(S)+l |Length_SS(S)+len

13、-mMAXLEN) retum(O);/客判断位置是否合理可(8 )主函数演示程序main()void main_SS()SString sl,s2,s3,sub,T;char strl100,str2100;int 11,12,13,pos Jen,n;while(l) coutn(l)串初始化操作:n输入两个字符串An”; cin.getline(strl ,sizeof(strl);/*表示从键盘输入一-个可以含冇空格字符的长度小于100的字符串到strl中,语句“cinstrl”不能 输入空格字符(空格符表示输入结束)且对串的长度不做检査。*/cin.getline(str2,size

14、of(str2);StrAssign SS(s 1 ,strl);StrAssign_SS(s2,str2); ll=Lcngth_SS(sl);!2=Length_SS(s2);coutn(2)求串长操作:nsl 的长度=”lln, s2 的长度=12endl; n=StrCompare_SS(s 1 ,s2);coutvv”串比较操作:n比较结果为:”;if(n0)coutusls2nn;else if(n=0)coutns 1 =s2nM;else coutnsls2nn;Concat_SS(s3 ,s 1 ,s2);coutn(4)串连接操作:nsl4-s2=Hs3endl;13=Lc

15、ngth_SS(s3);coutns 1 +s2 的长度=M13endl;cout”(5)求了串操作:n输入开始位置和串长(pos len):nn;cinposlen;if(SubString SS(sub,s3,pos,len) coutnsub=subendl;else coutn位置不正确n”;cout”(6)申替换操作:n输入替换的位置和字符数(pos len):n; cinposlen;cout”输入替换串:n; cin.get();cin.getline(str 1 ,sizeof(str 1);StrAssign_SS(T,str 1); if(Replace_SS(s3,pos

16、,Ien,T) coutH替换结果为:ns3=Hs3endl; else cout”替换不成功! n;(程序运行过程略)3.定长顺序存储的特点定长顺序存储的串在基木操作方面主要有以下特点:(1)对于求串长度和串的复制操作而言,其时间复杂度依赖于字符串的长度;(2)在串删除和串插入操作时必须移动大量的字符;(3)如呆在串输入、串连接、串插入和串替换操作中串值的长度超过MAXLEN,则按约定 釆取“截尾”法处理,这将导致操作结果的不合理。4.2.2串的堆分配存储表示由于串操作基木上是以串整体的形式参与,在应用程序中串变量的氏度相差较大,并且 在操作中串值长度的变化也比较大。因此,事先为串变量设置固

17、定大小空间的数组不尽合理。用堆分配存储表示串的方法是:在程序执行过程中,根据串变量值的人小,在堆空间中动态分配一个连续的地址空间來 存储串变暈屮的字符,这样既可以避免产生串操作屮的“截断”现象又能合理使用内存空间 资源。1.串的堆分配存储结构在C+运行环境中,堆分配存储结构定义为struct HString char *ch; 串变量屮字符数纽的首地址int length; /串的长度;2.在堆分配存储结构中串基本操作的C+程序实现(1)串的赋值操作 void StrAssign_HS(HString &T,char str)该操作山字符串常量str生成一个HString型串T。void St

18、rAssign_HS(HString &T,char str)+909 int lcn=0,i;whilc(strlcn)lc n+; /计算串的长度(2 )求串长的操作 int Length HS(HString S)该操作返冋串S的长度,如果S为空串则返冋0。 int Length_HS(HString S) return(S.length); (3)串的比较操作 int StrComp_HS(HString S,HString T)该操作比较串S、T的人小。int StrComp_HS(HString S,HString T) int i;for(i=0;iT.length&iS.len

19、gth;i+) if(S.chi!=T.chi)break;retum(int)(S.chi-T.chi);(4 )串的清空操作 void ClearString_HS(HString &S)该操作清空串S所占的堆空间。 void ClearString_HS(HString &S) if(S.ch) deleteS.ch;S.ch=NULL;S.length=0;(5 )串的连接操作 void Concat_HS(HString &T,HString Sl,HString S2)该操作计算串SI、S2的连接串T。void Concat_HS(HString &T,HString Sl,HSt

20、ring S2)int i,j,k;T.length=S l.length+S2. length;i=j=k=O;T.ch=new charT.length+l; 分配链接串的储存空间while(T.chi+=Sl.chfj+4-); 将 SI 复制到 T(6 )求子串的算法 int SubString HS(HString &Sub,HString S,int pos,int len)该操作求串S pos个字符开始的len个字符组成的子串Sub,如果位置合理返M 1否则 返回0。int SubString_HS(HString &Sub,HString S,int pos,int len)i

21、nt i;if(pos 11|lenS.length+1) retum(O); 如果位置不合理时返回 0 值Sub.ch=new charlen+l; 动态分配子串的存储空间Sub.length=len;for(i=0;ilen;i-H-) Sub.chi=S.chpos+i-l; /将子串复制到 Sub 中Sub.chi=0;rctum(l);(7 )串插入操作的算法 int StrInsert_HS(HString &S,int pos,HString H)该操作在串S的笫pos个字符前面插入字符串H,如果位置合理返回1,否则返回0o int StrInsert_HS(HString &S

22、,int pos,HString H)(8 )串替换操作的算法 int Rcplacc_HS(HString &S,int n,int m,HString T)该操作将串S中第n个字符开始的m个字符替换为串T,如果位置n和字符数m合理返 回1否则返回0oint Rcplacc_HS(HString &S,int n,int m,HString T)int i,j,k=n+m-1;长度或位置不合理重新分配储存空间取S中前面的部分取T中的内容取S小剩余的部分HString SI;if(nl 11 mS. length+ l)return(O);S1. length=S. length+T. len

23、gth-m;S1 .ch=new charS 1. lengths 1; for(i=0;in-l ;i+)S l.chi=S.chi;fbr(j=O J0) cout,SlS2nH;else if(n0)coutnS lS2n;else coutv”Sl=S2n”;Concat_HS(S,Sl,S2);coutn(4)串连接操作:n:s1+s2=HS.chendl; coutHlcngth=nLcngth_HS(S)cndl;cout”(5)取了串操作:n输入取了串的位置和长度(pos len):nM; cinposlen;if(SubString_HS(sub,S,pos,len) cou

24、tnsub=sub.chendl;else coutn 位置不对!n”;coutv”(6)串插入操作:n请输入插入位置:;cinpos;cin.get(); coutn输入要插入的子串 V:n”;cin.getline(ssl,sizeof(ss 1);StrAssign_HS(V,ss 1); ifi(StrInsert_HS(S,pos,V) coutn插入结果为 s=uS.chendl; else cout*位置不对!n”;coutv”(7)申替换操作;n输入替换子串的位置和长度(pos len):nu; cinposlen;cin.get();coutn输入替换串 T:n; cin.g

25、etline(ss 1 ,sizeof(ss 1);StrAssign_HS(T,ss 1); if(Rcplacc_HS(S,pos,lcn,T) cout*结果为 s=nS.chcndl; else coutn 位置不对!n”;3.堆分配存储表示的特点从以上串基本操作的算法可以看出,堆分配存储结构的串既有顺序存储结构的特点,处 理方便,同时在操作屮对串的长度又没有任何限制,更显灵活,因此该存储结构在有关字符 串处理的应用程序中常被采用。4.2.3串的块链式存储表示1.块链式存储的概念和线性表的链式存储结构类似,可以采用链表方式存储串。由于串中的每个数据元索是 一个字符,在用链表存储串值时,

26、存在一个“结点大小”的问题,即每个结点最多可以存放 多少个串中字符。対于串“abedefghijk”,如果采用每个结点存放一个字符的链表结构存储, 其存储方式如图4.1(a)所示;如果采川每个结点存放三个字符的链表结构存储,其存储方式如 图4.1(b)所示。由于串长不一定是结点大小的整数倍,所以在链表的最后一个结点不一定能被 串中的字符占满,此时可补上若干个非串值字符(或其它非串值字符)。he 画结点大小为1个字符的链表he詞一 不卜罔卜剧卜两(b)结点大小为3个字符的琏表图4.1串的块链式存储结构为了便于进行串的操作,当以链表存储串值时,除了头指针head外还可以附设一个指向 尾结点的指针t

27、ail,并给岀当前串的长度。称如此定义的串的存储结构为串的块链式存储结构。2.块链式存储结构的表示在C卄运行环境中,可将块链式存储结构表示如下:#dcfinc CHUNKSIZE 80 定义每个结点的大小struct Chunk;struct LString Chunk *head,*tail; /串的头指针和尾指针int curlcn; 串的长度; 块链式结构的类型定义在一般情况下,对串的操作只需耍从前向后扫描即可,故对串值不必建立双向链表。设 尾指针的目的是为了便于进行串的连接操作,在串连接吋需要处理第一个串尾结点中的无效 字符。3.块链式存储的存储密度在串的块链式存储结构屮,结点人小的选择很重要,它肓接影响到串处理操作的效率。 如果块选取的充分大时(可在一个块中存储串的所有字符)即为定长存储;如果每个块只放 一个字符时即为链表存储。为了便于研究串值的存储效率我们给出如下存储密度的计算公式:吊值的存储密度=串值所占的存储位 实际分配的存储位假定next指针变量占用4个字节,每个字符占用1个字节,每个块中存放m个字符,那

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1