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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

数据结构第04章 串.docx

1、数据结构第04章 串第四章 串教学目的与要求本章目的是介绍串的逻辑结构、存储结构及其串上的基本运算。重点和难点本章重点是掌握串上实现的模式匹配算法,其也是本章难点。教学内容第一节串的基本概念.1.1 基本概念串:是零个或多个字符组成的有限序列。串中所包含的字符个数称为串的长度。空串:长度为0的串称为空串,它不包含任何字符。空白串:仅由一个或多个空格组成的串称为空白串。应注意空串和空白串的区别。子串、主串:串中任意个连续字符组成的子序列称为该串的子串,包含子串的串相应地称为主串。空串是任意串的子串,任意串是其自身的子串。子串在主串中的位置:通常,将子串在主串中首次出现时子串首字符对应的主串中的序

2、号定义为子串在主串中的位置。串的基本运算()求串的长度(Length)()串复制 (Copy):()串联接 (Concat)()串比较 (Compare)()字符定位(Index)除上述基本运算外,串运算还有求子串、子串的定位、子串的置换等操作。这些操作,一般可由这些基本操作实现。第二节串的存储结构4.2.1串的顺序存储1.静态存储分配的顺序串顺序串最简单的描述形式是直接使用定长的字符数组来定义。其定义形式为 # define maxstrsize 256 typedef char Seqstringmaxstrsise;利用类型描述符Seqstrsring可定义数组变量存储串,利用特定字符表

3、示串的结束(语言用转义字符0) 。例如Seqstrstring s; 变量s可存储长度不超过255个字符的字符串,以0作为串的结束。顺序串的类型定义也可以象线性表的顺序存储一样,在定义字符数组的基础上,引入描述长度的成员。其定义形式为 # define maxstrsize 256 typedef struct char chmaxstrsise; int length;Sqestring;(2)动态存储分配的顺序串(堆)上述两种方式的共同缺点是主串值的存储空间是静态分配的是定长的。动态分配则克服了上述缺点,其余定义形式为typedef struct char *ch; int length;

4、Hstring;成员ch为指针型,若串非空,按实际需要动态分配存储空间,ch指向其起始地址,否则ch为FULL。成员length存储串长度。(3)串的链式存储用单链表的方式来存储串值,就是串的链式存储,简称为链串。每个结点可以存储一个字符(数据域data为字符型),也可以存储多个字符(数据域data定义为字符型数组)。3基本运算的实现串匹配算法很多,这里只讨论的是一种简单的朴素的串匹配算法。在串匹配中,一般将主串称为目标(串),子串称为模式(串)。设T为目标串,设P为模式串。串匹配实际上是对合法的位置0in-m,依次将目标串中的子串Ti.i+m-1和模式串P0.m-1进行比较,若相等,则称从位

5、置i开始的匹配成功,否则,则称从位置i开始的匹配失败。位置i称为位移,匹配成功时,位置i称为有效位移,匹配失败时,位置i称为无效位移。(1) 顺序串上的子串的定位运算(模式匹配) 算法思想:通过一个循环依次检查n-m+1个合法的位移i(0in-m)是否为有效位移。i初值为0,终值为n-m,其确定了目标串中子串的起始位置,每趟匹配结束后通过i值加1(i+)使i指向下一合法位移。语言算法:Int naivestrmatch(Seqstring T, Seqstring P)/查找模式P在目标T中首次出现位置,成功时返回有效位移i,失败返回-1int i,j,k; int m=P.length, n

6、=T.length;/模式和目标串的长度 for (i=0;i=n-m;i+) /循环控制匹配的趟数,其由合法位移的个数确定 j=0;k=i; /确定模式串起始位置j、目标串动中子串的起始位置k,即合法位移i while (jdata=p1-data) t1=t1-next; p1=p1-next; else shift=shift-next; t1=shift;p1=P; /对应结点字符相等,t1,p1后移指向下一结点,否则,合法位移shift后移指向下一子串,t1、p1重新定位开始下趟匹配。 if (p1=NULL) return shift; else return NULL;/退出循环

7、后,判定匹配成功与否算法时间复杂度与顺序串上的子串的定位运算相同。分析:顺序串和链串上实现串的模式匹配,算法思想相同,但应注意,存储结构不同所导致的算法实现时具体操作上的区别。在顺序串上位移为整数,链串上位移为结点的地址;子串与模式匹配时工作变量后移在顺序串上通过加1实现,链串上靠指针变量后移实现;匹配成功与否的判令条件顺序串上为j=m,链串上为p=NULL。对于不同的存储结构能够写出算法这是学习数据结构的基本要求,改变存储结构要求应写出算法这也是一个重点。这一点大家应给予足够的重视。应用举例算法阅读题下列算法的功能是比较两个链串的大小,其返回值为: -1 s1s2请在空白处填入适当的内容。2

8、001int comstr(linkstring s1,linkstring s2)/s1和s2为两个链串的头指针 while(s1&s2) if(s1-datadata) return 1;if(s1-datas2-data) return 1; if( ) return 1; if( ) return 1; ;分析该题考核点是串的比较操作。While型循环通过指针s1、s2将两个串中字符逐一比较,若发现不等字符,则不等字符的大小就是两个串的大小;若所比较字符均相等,直到有串被扫描完为止,退出循环。然后判断,若某个串未被扫描完,则其值大,若两个串同时被扫描完,则两个串相等。答案s1=s1-n

9、ext; s2=s2-next; s2(或s2!=NULL) s1(或s1!=NULL) return 02 编写算法实现现两个串的连接。算法如下:void stringcat(Hstring S,Hstring T)char *p,*q; p=S.ch+S.length; q=t.ch; while(pS.ch+maxsize&qT.ch+T.length) *p+ =*q+; if(qT.ch+maxsize) S.lengh=maxsize; else S.length=S.lengh+T.length;3 删除主串中所有指定子串。算法如下:void delsubstring(Hstri

10、ng S,Hstring T)int i=0,j,k; while(iS.length) for(j=i,k=0;k=T.length) while(jS.length) S.chj-T.length=S.chj; j+; S.length=S.length-T.length;elsei+; 【历届试题分析】一、选择题1 下所述中正确的是( )2001A 串是一种特殊的线性表 B串的长度必须大于零C 串中元素只能是字母 D 空串就是空白串答案A2若目标串的长度为n,模式串的长度为n/3,则执行模式匹配算法时,在最坏情况下的时间复杂度是()2001AO(n/3) BO(n) CO(n2) DO(

11、n3)分析最坏情况下模式匹配的时间复杂度为O(n-n/3+1)*n/3),由于n和n/3是同阶的,所以,时间复杂度可写为O(n2)。答案C3设有两个串T和P,求P在T中首次出现的位置的串运算称作( )2003A联接 B求子串 C字符定位 D子串定位分析该题考核点是串的基本操作。答案D4为查找某一特定单词在文本中出现的位置,可应用的串运算是( ) 2002 A插入 B删除 C串联接 D子串定位答案D5已知函数Sub(s,i,j)的功能是返回串s中从第i个字符起长度为j的子串,函数Scopy(s,t)的功能为复制串t到s。若字符串S=SCIENCESTUDY,则调用函数Scopy(P,Sub(S,

12、1,7)后得到( )2002 AP=SCIENCE BP=STUDY CS=SCIENCE DS=STUDY分析该题考核点是串的基本操作,函数Scopy(P,Sub(S,1,7)将串中子串SCIENCE复制到P中,而串S值未变。正确答案为A。答案A二、填空题6在串S=structure中,以t为首字符的子串有12个。2001分析该题考核点是子串的概念。其中存在两个长度为1的子串。答案127串S=I am a worker的长度是_。2002分析该题考核点是串长度的概念。答案138设S1=good,S2= ,S3=book,则S1,S2和S3依次联接后的结果是_。2003分析该题考核点是串的连接

13、操作及空白串的概念。答案good book三、算法阅读题9下列算法的功能是比较两个链串的大小,其返回值为: -1 s1s2请在空白处填入适当的内容。2001int comstr(linkstring s1,linkstring s2)/s1和s2为两个链串的头指针 while(s1&s2) if(s1-datadata) return 1;if(s1-datas2-data) return 1; if( ) return 1; if( ) return 1; ;分析该题考核点是串的比较操作。While型循环通过指针s1、s2将两个串中字符逐一比较,若发现不等字符,则不等字符的大小就是两个串的大

14、小;若所比较字符均相等,直到有串被扫描完为止,退出循环。然后判断,若某个串未被扫描完,则其值大,若两个串同时被扫描完,则两个串相等。答案s1=s1-next; s2=s2-next; s2(或s2!=NULL) s1(或s1!=NULL) return 0同步练习题一、 选择题1下列有关字符串的描述,正确的是( A )A. 字符串是0个或多个字符构成的有限序列;B. 字符串是0个或多个字母不同的有限序列;C. 字符串中最少要有一个子符;D. 字符串中不能有空格字符。2 字符串S=string中,包含的子串的个数是(C )(空串)A. 20 B. 21 C. 22 D. 233目标串为T=thi

15、s is a string,模式串P=string,进行模式匹配,有效位移是(C )(起始位置为0)。 A. 9 B. 10 C. 11 D. 124已知串S= string,T=this,执行运算strlen(strcopy(S,T)的结果是(A ) A. 4 B. 6 C. 10 D. 2 5目标串为T=this is a string,模式串P=string,进行模式匹配,所有的无效位移数是( B ) A. 6 B. 10 C. 16 D. 116下列命题正确的是(C ) A. 空串就是空白串; B. 空串不是串; C. 空串是长度为0的字符串 D. 串相等指的是长度相等7若字符串采用链

16、式存储,每个字符占用一个字节,每个指针在占用四个字节,则该字符串的存储密度为(D ) A. 50% B. 25% C. 75% D. 20%8当目标串的长度为n,模式串的长度为m时,朴素的模式匹配算法最坏情况下字符的比较次数(C ) A . n B. n*m C. (n-m+1)*m D. m9当目,模式串的长度为m时,朴素的模式匹配算法最好情况下字符的比较次数(B ) A. n B. m C. n+m D n-m10字符串是一种特殊的线性表,它与一般线性表的区别是( )A. 字符串是一种线性结构; B. 字符串可以进行复制操作;C. 字符串由字符构成并且通常作为整体参与操作;D. 字符串可以

17、顺序存储也可以链式存储。二、填空题1空串的长度为 0 ,空格串(空白串)的长度为 空格数 。2子串的定位运算又称为 ,通常把主串又称为 目标 子串又称为 模式 。3成功匹配的起始位置称为 有效位移 ,匹配失败的起始位置称为 无效位移 。 4设目标串为T=abccdadeef,模式串P=ade,则第 6 趟匹配成功。5已知串T=abccdadeef,P=abccyde,函数strcmp(T,P)的运算结果是 0 。 6串朴素的模式匹配算法在顺序串和链串上运行,时间复杂度o(m+n) 。7 已知串T=abccdadeef,T中包含以b打头的子串有 9 个。8通常在程序设计中,串分为 串常量 和 串

18、变量 。9按存储结构通常分为 顺序 和 链式 。10设s1=GOOD,s2= ,s3=BYE!,则s1,s2,和s3连接后的结果是 。三阅读程序题1 指出程序功能int stringcmp(Hstring S,Hstring T)int i=0,tag=1; if (S.length!=T.length) tag=0; else while(iS.length&tag)if (S.chi=T.chi) i+;else tag=0; return tag; 2阅读程序int stringpatindex (Hstring S,Hstring T)int i,j,k; for(i=0;iS.len

19、gth;i+) for(j=i,k=0;k=T.length) return i;return 1; (1)指出程序功能;(2)设S中存储there are a string ,T中存储?r函数的返回值是什么?3阅读程序指出程序功能void restring(Hstring S)char *p,*q,c; p=S.ch;q=S.ch+S.length-1; while(pq) c=*p;*p=*q;*q=c;p+;q-; 四、程序设计题1 编写算法实现两个串的连接。2 设计算法删除主串中所有指定子串3 编写算法判断串是否为回文同步练习题答案一、选择题1A 2C3C4A5B6C7D8C9B10C

20、二、 填空题10, 包含空格的的数;2模式匹配,目标串,模式串;3有效位移,无效位移;46;50;6O(m+n); 79;8串常量,串变量;9顺序串,链串;10GOOD BYE!三阅读程序题1【答案】判断两个串是否相等,若相等返回1,否则返回0。2【答案】(1)带通配符?的子串定位函数;(2)返回值为1。3【答案】将一个串逆置。四、程序设计题4 实现两个串的连接算法:void stringcat(Hstring S,Hstring T)char *p,*q; p=S.ch+S.length; q=t.ch; while(pS.ch+maxsize&qT.ch+T.length) *p+ =*q

21、+; if(qT.ch+maxsize) S.lengh=maxsize; else S.length=S.lengh+T.length;5 删除主串中所有指定子串算法:void delsubstring(Hstring S,Hstring T)int i=0,j,k; while(iS.length) for(j=i,k=0;k=T.length) while(jS.length) S.chj-T.length=S.chj; j+; S.length=S.length-T.length;elsei+; 3判断串是否为回文算法:int tringcomp(Hstring S,Hstring T

22、)char *p,*q; p=S.ch;q=S.ch+S.length-1; while(p=q) return 1;return 0;课后习题解答基础知识题1 简述下列每对术语的区别:空串和空白串;串常量和串变量;主串和子串;静态分配的顺序串和动态分配的顺序串5、目标考核模式串;有效位移和无效位移。【答案】略2假设有如下的串说明char s130=Stocktom,CA,s2=March 5,1999,s330,*p;(1) 在执行下列语句后,P的值是什么?p=strchr(s1,t); p=str(s3,9); p=strchr(s2,6);(2) 在执行下列语句后,S3的值是什么?str

23、cpy(s3,s1); strcat(s3,); strcat(s3,s2);(3) 调用函数strcmp(s1,s2)的返回值是什么?(4) 调用函数strcmp(&s15,tom)的返回值是什么?(5) 调用函数strlen(strcat(s1,s2)的返回值是什么?【答案】(1)p的值依次为字符t在串s1中的位置,字符9在串s3中的位置,字符6在串s2中的位置。(2)执行语句strcpy(s3,s1); 后,S3的值是:Stocktom,CA执行语句strcat(s3,); 后,S3的值是:Stocktom,CA,执行语句strcat(s3,s2); 后,S3的值是:Stocktom,C

24、A,March 5,1999(3)调用函数strcmp(s1,s2)的返回值是:大于0;(4)调用函数strcmp(&s15,tom)的返回值是:大于0(5)调用函数strlen(strcat(s1,s2)的返回值是:s1和s2联接后的串长度:233 T0.n-1=abaabaabcaabaa,P0.m-1=aab。当用模式串P匹配目标串,请给出所有的有效位移。算法NaiveStrMatch(T,P)返回的位移是哪一个位移。【答案】所有的有效位移依次为:2,5,9;算法NaiveStrMatch(T,P)返回的位移是:2算法设计题4 利用C的库函数strlen,strcpy和strcat写一个

25、算法void strinsert(char *S,char *T,int i),将串T插入到串S的第i个位置上。若i大于S的长度,则插入不执行。【答案】#include string.h#defin maxsize 256void strinsert(char *S,char *T,int i)int slen; char sbufmaxsize; slen=strlen(S); if (islen) printf(invalid para in); else strcpy(sbuf1,S,i); strcat(sbuf1,T); strcpy(sbuf2,S+i); strcat(sbuf1

26、,sbuf2);strcpy(S,sbuf1); printf(string S:%s,S); 5利用的库函数strlen,strcpy和strcat写一个算法void strdelete(char *S,int i,int m),删去串S中从第i个字符开始的连续m个字符。若istrlen(S),则没有字符被删除,若i+mstrlen(S),。则将串S中从第i个字符开始直到末尾的字符删去。【答案】#defin maxsize 256#include string.hvoid strdelete(char *S,int i,int m)int slen; char sbuf1maxsize,sbuf2maxsize; slen=strle

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

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