数据结构c语言版(串).

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

第四章串第四章串第四章串4.1串类型的定义4.2串的表示和实现4.3串的模式匹配算法4.4串操作应用举例第四章串4.1串类型的定义1基本概念1.串的定义串(string)是由零个或多个字符组成的有限序列,记作s=“a1a2…an”,其中s为串的名字,用成对的双引号括起来的字符序列为串的值,但两边的双引号不算串值,不包含在串中。ai(1≤i≤n)可以是字母、数字或其它字符。n为串中字符的个数,称为串的长度。第四章串2.空串不含任何字符的串称为空串,它的长度n=0,记为s=“”。3.空白(空格)串含有一个或多个空格的串,称为空白串,它的长度n为空格的个数。第四章串4.子串、主串若一个串是另一个串中连续的一段,则这个串称为另一个串的子串,而另一个串相对于该串称为主串。例如,串s1=“abcdefg”,s2=“fabcdefghxyz”,则s1为s2的子串,s2相对于s1为主串。第四章串通常将子串在主串中首次出现时的该子串的首字符对应的主串中的序号,定义为子串在主串中的序号(或位置)。例如,设A和B分别为A=“Thisisastring”B=“is”则B是A的子串,A为主串。B在A中出现了两次,其中首次出现所对应的主串位置是3。因此称B在A中的序号(或位置)为3第四章串特别的,空串是任意串的子串,任意串是自身的子串。通常在程序中使用的串可分为两种:串变量和串常量。串常量和整常数、实常数一样,在程序中只能被引用但不能改变其值,即只能读不能写。通常串常量是由直接量来表示的,例如语句Error(“overflow”)中“overflow”是直接量。但有的语言允许对串常量命名,以使程序易读、易写。串变量和其它类型的变量一样,其取值是可以改变的。第四章串2串类型的定义如下:ADTString{数据对象:D={ai|ai∈CharacterSet,i=1,2,...,n,n≥0}n称为串的长度数据关系:R1={ai-1,ai|ai-1,ai∈D,i=2,...,n}串是有限长的字符序列,由一对单引号相括,如:“astring”第四章串基本操作:StrAssign(&T,chars)StrCopy(&T,S)DestroyString(&S)StrEmpty(S)StrCompare(S,T)StrLength(S)Concat(&T,S1,S2)第四章串SubString(&Sub,S,pos,len)Index(S,T,pos)Replace(&S,T,V)StrInsert(&S,pos,T)StrDelete(&S,pos,len)ClearString(&S)}ADTString第四章串StrAssign(&T,chars)初始条件:chars是字符串常量。操作结果:把chars赋给T。StrCopy(&T,S)初始条件:串S存在。操作结果:由串S复制得串T。StrEmpty(S)初始条件:串S存在。操作结果:若S为空串,则返回TRUE,否则返回FALSE。表示空串,空串的长度为零。第四章串DestroyString(&S)初始条件:串S存在。操作结果:串S被销毁。StrCompare(S,T)初始条件:串S和T存在。操作结果:若ST,则返回值0;若ST,则返回值0;若ST,则返回值0。例如:StrCompare(data,state)0StrCompare(cat,case)0第四章串StrLength(S)初始条件:串S存在。操作结果:返回S的元素个数,称为串的长度。Concat(&T,S1,S2)初始条件:串S1和S2存在。操作结果:用T返回由S1和S2联接而成的新串。例如:Concat(T,man,kind)求得T=mankind第四章串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;SubString(sub,commander,4,7)sub=?SubString(sub,beijing,7,2)=?sub=?SubString(student,5,0)=起始位置和子串长度之间存在约束关系长度为0的子串为“合法”串第四章串Index(S,T,pos)初始条件:串S和T存在,T是非空串,1≤pos≤StrLength(S)。操作结果:若主串S中存在和串T值相同的子串,则返回它在主串S中第pos个字符之后第一次出现的位置;否则函数值为0。“子串在主串中的位置”意指子串中的第一个字符在主串中的位序。假设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相等的不重叠的子串。例如:假设S=abcaabcaaabca,T=bca若V=x,则经置换后得到S=axaxaax若V=bc,则经置换后得到S=abcabcaabc第四章串StrInsert(&S,pos,T)初始条件:串S和T存在,1≤pos≤StrLength(S)+1。操作结果:在串S的第pos个字符之前插入串T。例如:S=chater,T=rac,则执行StrInsert(S,4,T)之后得到S=characterStrDelete(&S,pos,len)初始条件:串S存在,1≤pos≤StrLength(S)-len+1。操作结果:从串S中删除第pos个字符起,长度为len的子串。第四章串ClearString(&S)初始条件:串S存在。操作结果:将S清为空串。第四章串对于串的基本操作集可以有不同的定义方法,在使用高级程序设计语言中的串类型时,应以该语言的参考手册为准。gets(str)输入一个串;puts(str)输出一个串;strcat(str1,str2)串联接函数;strcpy(str1,str2)串复制函数;strcmp(str1,str2)串比较函数;strlen(str)求串长函数;例如:C语言函数库中提供下列串处理函数:第四章串在上述抽象数据类型定义的13种操作中,串赋值StrAssign、串比较StrCompare、求串长StrLength、串联接Concat以及求子串SubString等五种操作构成串类型的最小操作子集。即:这些操作不可能利用其他串操作来实现,反之,其他串操作(除串清除ClearString和串销毁DestroyString外)可在这个最小操作子集上实现。第四章串例如,可利用串比较、求串长和求子串等操作实现定位函数Index(S,T,pos)。StrCompare(SubString(sub,S,i,StrLength(T)),T)?0S串T串T串iposn-m+1算法的基本思想为:第四章串intIndex(StringS,StringT,intpos){//T为非空串。若主串S中第pos个字符之后存在与T相等的子串,//则返回第一个这样的子串在S中的位置,否则返回0if(pos0){n=StrLength(S);m=StrLength(T);i=pos;while(i=n-m+1){SubString(sub,S,i,m);if(StrCompare(sub,T)!=0)++i;elsereturni;}//while}//ifreturn0;//S中不存在与T相等的子串}//Index算法:4.1第四章串串的逻辑结构和线性表极为相似,区别仅在于串的数据对象约束为字符集。串的基本操作和线性表有很大差别。在线性表的基本操作中,大多以“单个元素”作为操作对象;在串的基本操作中,通常以“串的整体”作为操作对象。第四章串在程序设计语言中,如果串只是作为输入或输出的常量出现,则只需存储此串的串值,即字符序列即可。但在多数非数值处理的程序中,串也以变量的形式出现。4.2串的表示和实现4.2.1定长顺序存储表示4.2.2堆分配存储表示4.2.3串的块链存储表示第四章串#defineMAXSTRLEN255//用户可在255以内定义最大串长typedefunsignedcharSstring[MAXSTRLEN+1];//0号单元存放串的长度4.2.1定长顺序存储表示第四章串按这种串的表示方法实现的串的运算时,其基本操作为“字符序列的复制”。串的实际长度可在这个预定义长度的范围内随意设定,超过预定义长度的串值则被舍去,称之为“截断”。特点:第四章串StatusConcat(SString&T,SStringS1,SStringS2){//用T返回由S1和S2联接而成的新串。若未截断,则返回TRUE,否则FALSE。returnuncut;}//Concat例如:串的联接算法中需分三种情况处理: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;}if(S1[0]+S2[0]=MAXSTRLEN){//未截断elseif(S1[0]MAXSTRSIZE){//截断else{//截断(仅取S1)T[1..S1[0]]=S1[1..S1[0]];T[S1[0]+1..MAXSTRLEN]=S2[1..MAXSTRLEN-S1[0]];T[0]=MAXSTRLEN;uncut=FALSE;}T[0..MAXSTRLEN]=S1[0..MAXSTRLEN];//T[0]==S1[0]==MAXSTRLENuncut=FALSE;}算法:4.2第四章串求子串:StatusSubString(SString&Sub,SStringS,intpos,intlen){//用Sub返回串S的第pos个字符起长度为len的子串。//其中,1≤pos≤StrLength(S)且0≤len≤StrLength(S)-//pos+1。if(pos1||posS[0]||len0||lenS[0]-pos+1)returnERROR;Sub[1..len]=S[pos..pos+len-1];Sub[0]=len;returnOK;}//SubString算法:4.3第四章串typedefstruct{char*ch;//若是非空串,则按串长分配存储区,//否则ch为NULLintlength;//串长度}HString;4.2.2堆分配存储表示第四章串通常,C语言中提供的串类型就是以这种存储方式实现的。系统利用函数malloc()和free()进行串值空间的动态管理,为每一个新产生的串分配一个存储区,称串值共享的存储空间为“堆”。C语言中的串以一个空字符为结束符,串长是一个隐含值。这类串操作实现的算法为:先为新生成的串分配一个存储空间,然后进行串值的复制。第四章串StatusStrInsert(HString&S,intpos,HStringT){//1≤pos≤StrLength(S)+1。//在串S的第pos个字符之前插入Tif(pos1||posS.length+1)returnERROR;//pos不合法if(T.length){//T非空,则重新分配空间,插入Tif(!(S.ch=(char*)realloc(S.ch,(S.length+T.length)*sizeof(char))))exit(OVERFLOW);第

1 / 69
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功