




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第5章串5.1串的应用实例及概念5.2串的存储结构5.3串的基本操作5.4串的ADT定义及类定义5.5实习五:串的演示程序5.1串的应用实例及概念在各种高级语言的编译程序中,源程序和目标程序都被处理成字符串数据,各源程序编辑器的功能强弱有差异,但其基本操作是一致的,一般都包括串的查找、插入及删除等。例如,在Delphi中创建一个新的源程序文件,并在其中输入以下内容:typeTstring=classprivate{privatedeclaration}public{publicdeclaration}end;这一段程序可看作一个字符串:“typeTstring=classprivate{privatedeclaration}public{publicdeclaration}end;”,其中“”表示换行符。Delphi的源程序编辑器提供了字符串的查找与替换功能。选择“Search”菜单中的“Replace”项,在对话框中输入要查找字符串‘private’及替代串‘protected’,如图5.1所示,则执行命令后以上程序中的关键字‘private’被‘protected’替代。图5.1Delphi中源程序编辑器提供的字符串替换功能一般地,串(字符串)被定义为由零个或多个字符组成的有限序列。记为:s=‘a1a2…an’(n≥0)其中,s是串的名,也称为串变量。单引号内的字符序列为串值。ai(1≤i≤n)可以是字母、数字或其他字符。串中字符的数目n称为串的长度。零个字符的串称为空串(nullstring),长度为零。串中任意个连续的字符组成的子序列称为该串的子串。包含子串的串称为主串。通常称字符在序列中的序号为该字符在串中的位置。子串在主串中的位置可以用子串的第一个字符在主串中的位置来表示。例如,假设a、b、c、d为如下的四个串:a=‘Data’b=‘Structure’c=‘DataStructure’d=‘DataStructure’则它们的长度分别为4、9、13和14,并且a和b都是c和d的子串,a在c和d中的位置都是1。而b在c中的位置是5,在d中的位置则是6。5.2串的存储结构5.2.1顺序存储结构和线性表的顺序存储结构相类似,串的存储结构可以用一组地址连续的存储单元存储串的字符序列。利用数组,可将这种数据类型描述如下:constmaxlen=允许的串最大长度;typestrtp=recordcurlen:0..maxlen;ch:array[1..maxlen]ofchar;end;图5.2串的顺序存储结构(a)非紧缩方式;(b)紧缩方式5.2.2链式存储结构和线性表的链式存储结构相类似,串的存储结构也可采用链式存储结构,即用线性链表来存储串值。在这种存储结构下,存储空间被分成一系列大小相同的结点,每个结点用data域存放字符,link域存放指向下一个结点的指针。这样,一个串就可以用一个线性链表来表示。由于串结构的特殊性,在串的链表结构中常常涉及到结点的大小问题,即如何确定结点的data域存放字符的个数问题。通常情况下,结点的大小为4或1,如图5.3所示。当结点的大小为4时,串所占用的结点中最后一个结点的data域不一定全被串值占满,这时通常补上“#”或其他的非串值字符。图5.3串的链式存储结构(a)节点大小为4的链表;(b)节点大小为1的链表串的链式存储结构可定义如下:constnodesize=定义的结点大小;typelink=^node;node=recordch:array[1..nodesize]ofchar;next:link;end;linkerstring=recordhead:link;length:integer;end;图5.4串存储的堆结构示例(a)存储空间;(b)映像空间1.求子串操作设源串为s,则求子串操作为将源串s的一部分复制到新串sub内。假设源串s:strtp已在外部进行了说明,截取的子串位置为pos:integer,截取长度为len:integer,并且取出的子串被复制入串sub:strtp中,则子串操作过程如下:proceduresubstring(pos,len:integer;varsub:strtp);功能:在源串s中截取从pos开始的长len的子串,并将其复制到字符串sub中。5.3串的基本操作处理过程:(1)若截取子串的位置或长度超出合法值,即当pos>s.curlen或pos,len<1时,显示出错信息并终止。(2)若截取子串的位置在串长范围以内,且截取长度未超出最大可供截取长度,即当1≤pos≤s.curlen且1≤len≤s.curlen-pos+1时,将源串s中从pos开始的长度为len的内容复制到串sub中,如图5.5所示。图5.5求子串操作示意图(3)若截取子串的位置在串长范围以内,但截取长度超出最大的可供截取长度,即当1≤pos≤s.curlen且len>s.curlen-pos+1时,按截尾法处理:将源串s从pos开始到串尾的全部内容复制给串sub。以下是该过程的程序清单:proceduresubstring(pos,len:integer;varsub:strtp);{将源串s中指定位置的子串}vari:integer;{复制入串sub}beginif(pos>s.curlen)or(pos<1)or(len<1)thenshowmessage('error')elsebegin{若截取长度超出最大可供截取长度,则将其缩短至}iflen>s.curlen-pos+1thenlen:=s.curlen-pos+1;{最大可供截取长度}sub.curlen:=len;{设定sub串长}fori:=1tolendo{复制源串s从pos开始长度为len的子串至sub}sub.ch[i]:=s.ch[pos+i-1];end;end;2.删除操作删除操作可删除源串s中指定范围内的串值。设源串s:strtp已在外部进行了说明,删除起始位置为pos:integer,删除长度为len:integer,则删除操作过程如下:proceduredelete(pos,len:integer);功能:在源串s中删除从pos开始的长度为len的子串。图5.6删除子串操作示意处理过程:(1)若删除起始位置或长度超出合法值,即当pos>s.curlen或pos,len<1时,显示出错信息并终止。(2)若删除起始位置在串长范围以内且删除长度未超出最大可供删除长度,即当1≤pos≤s.curlen且1≤len≤s.curlen-pos+1时,将源串s中从pos开始的长度为len的内容删除,如图5.6所示。(3)若当删除起始位置在串长范围以内,但删除长度超出了最大可供删除长度,即当1≤pos≤s.curlen且len>s.curlen-pos+1时,按截尾法处理:将源串s中从pos开始到串尾的全部内容删除。以下是该过程的程序清单:proceduredelete(pos,len:integer);{将源串s中指定范围内的子串删除}vari:integer;beginif(pos>s.curlen)or(pos<1)or(len<1)thenshowmessage(’error’)elsebegin{若删除长度超出最大可供删除长度,则将其缩短至}iflen>s.curlen-pos+1thenlen:=s.curlen-pos+1;{最大可供删除长度}fori:=postos.curlen-lendo{将源串s从pos+len开始至}s.ch[i]:=s.ch[len+i];{串尾的子串复制到从pos开始的位置}s.curlen:=s.curlen-len;{重新设置s的串长}end;end;
3.插入操作插入操作可将一个串插入源串s中的指定位置。设源串s:strtp已在外部说明,插入的串为t:strtp,插入位置为pos:integer,则插入操作过程为 procedureinsert(pos:integer;t:strtp);
功能:在源串s中pos指示的位置之后插入串t。处理过程:(1)当插入位置超出合法值或s串长已达最大值,即当pos<1或pos>maxlen或s.curlen=maxlen时,显示出错信息并终止。(2)当插入位置在s串长范围以内,即当1≤pos≤s.curlen时,则将串t插入源串s中pos之后的位置,如图5.7所示。其中,如s、t两串之和超过串所允许的最大长度,则可采用截尾法截去超长部分,如图5.8所示。图5.7插入子串操作示意图5.8插入子串操作示意图(发生截尾)(3)当插入位置在串长范围以外但小于等于串长最大值,即当s.curlen<pos≤maxlen时,则将串t连接至s的尾部,并采用截尾法截去超长部分。以下是该过程的程序清单:procedureinsert(pos:integer;t:strtp);{在串s中的指定位置pos后插入串t}vari,len,n:integerbeginif(pos>maxlen)or(pos<1)or(s.curlen=maxlen)thenshowmessage(’error’)elsebegin{若插入位置超出串s的长度,}ifpos>s.curlenthenpos:=s.curlen;{则将其调整至串s的末尾}ifs.curlen+t.curlen<maxlenthenlen:=s.curlen+t.curlenelselen:=maxlen;{计算新串长}n:=len-pos-t.curlen;ifn>0then{若新串长大于插入点之前的字符长度与}fori:=1tondo{串t的长度之和,则将插入点之后的n个}s.ch[len-i+1]:=s.ch[pos+n-i+1];{字符移至新串串尾}fori:=1tot.curlendo{将串t复制入串s}ifpos+i>lenthenbreakelses.ch[pos+i]:=t.ch[i];s.curlen:=len;{重新设置s的串长}end;end;4.子串定位操作子串定位操作可求取源串s中某一特定子串的位置。子串定位操作通常称为串的模式匹配,其中,要求被定位的子串称为模式。模式匹配是各种串处理系统中最重要的操作之一。如在本章开头提到的文本编辑器和信息检索的实例中,均涉及到串的模式匹配。实现模式匹配的最简单办法就是从s的第一个字符开始试着对t进行匹配,直至匹配成功或搜寻到串尾。设串s:strtp已在外部说明,被要求定位的子串(模式串)为t:strtp,则子串定位操作可被表达成如下函数:functionposition(t:strtp):integer;
功能:在源串s中查找与t相同的子串,若查找成功,则返回该子串的位置,否则返回0。处理过程:(1)从第s的一个字符开始对串t进行匹配。(2)若失败,则从s的下一位置的字符开始进行匹配。(3)重复(2),直至匹配成功或搜寻到s的串尾。为实现这一处理过程,我们可以设置两个指针i、j分别用来指示串s和t中当前正在比较的字符,并在算法开始时令i、j分别指向s和t的第一个字符。当i未到s串尾时,可作以下操作:(1)若i、j指示的字符相等,且j已达到串t的尾部,则匹配成功,返回字符串的位置。(2)若i、j指示的字符相等,且j还未达到串t的尾部,则i、j分别指向s和t中的下一个字符。(3)若i、j指示的字符不等,则匹配失败,i指向s中该趟匹配开始位置的下一个字符,j指向t的第一个字符,开始下一轮匹配。当i已达到s最后一个字符而还未匹配成功,则s中无与t相等的子串。程序如下:functionposition(t:strtp):integer;{求串t在源串s中的位置}vari,j:integer;begini:=1;j:=1;{i,j分别用来指示串s,t中当前比较的字符位置}while(i<=s.curlen)and(j<=t.curlen)doifs.ch[i]=t.ch[j]then{如果当前位置上的字符相同,则比较下一位字符}begini:=i+1;j:=j+1;endelse{若当前位置上的字符不相同,则指针i,j后退,重新开始匹配}begini:=i-j+2;j:=1;end;{若j已到t的串尾,则匹配成功,返回子串位置,否则返回0}ifj>t.curlenthenposition:=i-t.curlenelseposition:=0;end;图5.9模式匹配过程5.替换操作替换操作可将源串s中某一特定子串用另外一个串替换。要成功实现替换操作,必须首先查找t在s中的位置。这可通过以上模式匹配函数实现。若匹配成功,下一步则是进行替换。替换可通过在s中先删除子串t,然后再插入串s来实现。设源串s:strtp已在外部说明,被要求替换的串为t:strtp,替换串为r:strtp,则替换操作过程如下:procedurereplace(t,r:strtp);功能:在串s中用子串r替换子串t。处理过程:(1)查找子串t在s中的位置。(2)在s中删除子串t。(3)在s中原来t的位置上插入子串r。程序清单如下:procedurereplace(t,r:strtp);{在源串s中,用串r替换子串t}varpos:integer;begin{调用模式匹配函数求子串t的位置}pos:=position(t);{若匹配失败则显示出错信息}ifpos=0thenshowmessage(’cannotfindsubstring’)elsebegindelete(pos,t.curlen);{删除子串t}insert(pos-1,r);{插入串r,完成替换}end;end;5.4串的ADT定义及类定义5.4.1串的ADT定义根据面向对象程序设计的原则,实现部分与接口部分两者应该分离。接口部分可以用ADT定义即抽象数据类型定义来进行描述。一种数据类型的ADT定义由数据元素、结构及操作三部分组成。以下是串的ADT定义:元素:ai同属于字符类型,i=1,2,…,nn≥0。结构:元素间呈线性关系。操作:常用的串的基本操作有以下几种:(1)create(s,ss):初始化操作。建立一个串s,其值为字符序列ss。(2)equal(s,t):判等函数。若s和t相等,则返回true,否则返回false。(3)length(s):求长函数。其函数值为s中字符的个数。(4)substring(s,start,len):求子串操作。若1≤start≤length(s)+1且0≤len≤length(s)-start+1,则返回函数值为串s中第start个字符起,长度为len的字符序列;否则返回一个特殊的串常量。(5)delete(s,pos,len):删除操作。当1≤pos≤length(s)且0≤len≤length(s)-pos+1时,从串s中删去第pos个字符起长度为len的子串。(6)insert(s,pos,t):插入操作。当1≤pos≤length(s)+1时,在串s的第pos个字符之前插入串t。(7)position(s,t):定位函数。若在主串s中存在和t相等的子串,则返回s中第一个这样的子串在主串s中的位置,否则函数值为0。(8)replace(s,t,v):置换操作。操作结果是以串v替换所有在串s中出现的和非空串t相等的子串。5.4.2顺序串的类定义在采用顺序存储的串的类定义中,数据部分包括一个字符数组和一个有界整型变量,用以存放串值及串长。相应的操作包括初始化(constructorinit),求子串(proceduresubstring),删除(proceduredelete),插入(procedureinsert),子串定位(functionposition)和替换(procedurereplace)等。这些过程或函数被定义成公有型,可以向外部提供服务。顺序串的类定义可定义如下:constmaxlen=允许的串最大长度;Tstring=classprivatecurlen:0..maxlen;ch:array[1..maxlen]ofchar;publicprocedureinit(s:string);proceduresubstring(pos,len:integer;varsub:Tstring);proceduredelete(pos,len:integer);procedureinsert(pos:integer;t:Tstring);functionposition(t:Tstring):integer;procedurereplace(t,r:Tstring);……;end;implementationvars1:Tstring;proceduceTstring.init(s:string)……procedureTstring.substring(pos,len:integer;varsub:Tstring);……procedureTstring.delete(pos,len:integer);……procedureTstring.insert(pos:integer;t:Tstring);……functionTstring.position(t:Tstring):integer;……procedureTstring.replace(t,r:Tstring);……5.5实习五:串的演示程序5.5.1问题说明字符串可作为一种变量类型出现在程序设计语言中。有关串的基本操作包括插入、删除、定位、替换等,这些操作的特点是将串作为一个整体加以操作。编制一个GUI教学演示程序,演示字符串的各种操作的执行效果。5.5.2界面外观及功能要求图5.10串的操作演示程序操作屏幕按初态按钮时,可按编辑框中指定的字符串生成一个初始字符串,并作为当前字符串显示在绘图板中。按插入按钮时,可按数字增减器中指定的位置,在当前字符串中插入编辑框中指定的字符串。按删除按钮时,可按数字增减器中指定的位置与长度,删除当前字符串中相应的子串。按替换按钮时,可按编辑框中指定的被替换的字符串和要替换的字符串,对当前字符串执行替换操作,即将其中的被替换的字符串替换成要替换的字符串。5.5.3实现要点(1)采用顺序的存储结构来表示一个串,并将串定义成一个类。(2)对串的初始化操作设置一个字符串类型的参数,并可按该参数中的字符串来生成一个初始状态的串。(3)删除操作是指将被删除的子串后的部分向前移动。插入操作是指将插入位置之后的部分向后移动,然后再插入要插入的子串。替换操作是指先执行定位操作,然后按该位置执行删除后再插入。5.5.4类定义将串定义成一个类,且采用顺序的存储结构,数据部分包括一个字符数组和一个有界整型变量,用以存放串值及串长,分别取名为ch及curlen。相应的操作为初始化(procedureinit(s:string)),定位(functionposition(t:Tstring):integer),删除(proceduredele(pos,len:integer)),插入(procedureinst(pos:integer;t:Tstring)),替换(procedurereplace(t,r:Tstring))及显示(procedureprnt)等。串的类定义Tstring可定义如下:Tstring=classprivatech:array[1..maxlen]ofchar;curlen:0..maxlen;publicprocedureinit(s:string);procedureprnt;functionposition(t:Tstring):integer;proceduredele(pos,len:integer);procedureinst(pos:integer;t:Tstring);procedurereplace(t,r:Tstring);end;5.5.5类的实现(1)初始化过程(procedureinit(s:string)):由参数s来建立字符串的顺序存储结构,即执行:len:=length(s);fori:=1tolendoch[i]:=s[i];curlen:=len;(2)定位函数(functionposition(t:Tstring):integer:)可确定字符串t在当前串中的位置。若t为当前串的一个子串,则返回该子串在当前串中的位置,否则返回0。其处理过程为:从当前串的第一个字符与t中的第一个字符开始比较,若相等,则继续逐个比较后继字符,否则从主串中本次开始位置的下一个字符位置开始继续比较,重复执行直至t中的每个字符依次与当前串中的字符相等则成功返回位置序号;或者直至当前串中的字符全都比较完仍不相等则不成功返回0。(3)删除过程(proceduredele(pos,len:integer):)可按参数中指定的子串的开始位置及长度删除当前串中相应的子串。其处理过程为:①检查参数是否合法,若不合法,则显示相应的信息或进行适当的调整。②将删除串之后的部分前移。③形成当前串的新的长度。(4)插入过程(procedureinst(pos:integer;t:Tstring)):可按参数中指定的位置将参数中指定的字符串插入到当前字符串中。其处理过程为:①检查位置参数是否合法以及当前字符串是否溢出,若合法且溢出,则进行以下的处理。②求后移子串的长度n,若n>0,则将该子串后移(从后向前逐个移动)。③将插入串移入到当前串中相应的位置(若发生溢出则截断之)。④形成当前串的新的长度。(5)替换过程(procedurereplace(t,r:Tstring)):按参数中指定的被替换的字符串和替换的字符串,对当前字符串执行替换操作,即将其中的被替换的字符串替换成要替换的字符串。其处理过程为:执行定位操作,求被替换的字符串在当前串中的位置,若被替换串存在,则执行删除操作,删除被替换串t,执行插入操作插入要替换串r。(6)显示过程(procedureprnt):在绘图板中可将当前字符串中的字符逐个显示出来。5.5.6组件设置PaintBox1:绘图板,显示栈的当前状态。Edit1,edit2:编辑框,用于指定插入或替换操作中作为参数的字符串。Sp1,sp2:数字增减器,用于指定插入操作中的位置或删除操作中的位置与长度。But0-4:初态、插入、删除、替换、退出按钮,用于执行演示操作。5.5.7界面功能的实现(1)窗体生成事件:在窗体生成事件处理程序中,生成一个Tstring类的实例chun1,并作为当前字符串,另外再生成两个Tstring类的实例chun2,chun3,可分别作为操作中的参数使用,生成时这些串的值一般可任意指定。chun1:=Tstring.create;chun1.init(’abcdefg’);chun2:=Tstring.create;chun2.init(’cde’);chun3:=Tstring.create;chun3.init(’ww’);(2)退出按钮:在退出按钮事件处理程序中,释放已生成的实例chun1,chun2,chun3,并关闭窗体释放空间。chun1.Free;chun2.Free;chun3.Free;close;release;(3)初态按钮:按编辑框edit1中指定的字符串生成一个初始字符串,并作为当前字符串显示在绘图板中。chun1.init(edit1.text);chun1.prnt(4)插入按钮:按数字增减器sp1中指定的位置,在当前字符串中插入编辑框edit1中指定的字符串,并在绘图板中重新显示当前字符串。pos:=sp1.value;s:=edit1.text;chun2.init(s);chun1.inst(pos,chun2);chun1.prnt(5)删除按钮:按数字增减器sp1中指定的位置及sp2中指定的长度,删除当前字符串中相应的子串,并在绘图板中重新显示当前字符串。pos:=sp1.Value;len:=sp2.value;chun1.dele(pos,len);chun1.prnt(6)替换事件:按在编辑框edit1中指定的被替换的字符串和在编辑框edit2中指定的要替换的字符串,对当前字符串执行替换操作,并在绘图板中重新显示当前字符串。s:=edit1.text;chun2.init(s);s:=edit2.text;chun3.init(s);chun1.replace(chun2,chun3);chun1.prnt5.5.8程序清单implementationvarchun1,chun2,chun3:Tstring;procedureTstring.init(s:string);vari,len:integer;beginlen:=length(s);fori:=1tolendoch[i]:=s[i];curlen:=len;end;procedureTstring.prnt;vari,ix,iy:integer;rect1:Trect;s:char;beginrect1:=rect(0,0,550,100);chunForm.PaintBox1.Canvas.Brush.Color:=clBtnFace;chunForm.PaintBox1.Canvas.FillRect(rect1);chunForm.PaintBox1.Canvas.pen.width:=4;chunForm.PaintBox1.Canvas.font.Color:=clred;chunForm.PaintBox1.Canvas.font.size:=18;ix:=10;iy:=0;ifcurlen>0thenfori:=1tocurlendobegins:=ch[i];chunForm.PaintBox1.Canvas.textout(ix+20,iy+12,s);ix:=ix+20endend;functionTstring.position(t:Tstring):integer;vari,j:integer;begini:=1;j:=1;while(i<=curlen)and(j<=t.curlen)doifch[i]=t.ch[j]thenbegini:=i+1;j:=j+1endelsebegini:=i-j+2;j:=1end;ifj>t.curlenthenposition:=i-t.curlenelseposition:=0;end;procedureTstring.dele(pos,len:integer);vari:integer;beginif(pos<1)or(pos>curlen)or(len<1)thenshowmessage(’infeasible’)elsebeginiflen>curlen-pos+1thenlen:=curlen-pos+1;fori:=postocurlen-lendoch[i]:=ch[len+i];curlen:=curlen-len;end;end;procedureTstring.inst(pos:integer;t:Tstring);vari,tlen,len,n:integer;beginif(pos<1)or(pos>maxlen)thenshowmessage('infeasible')elseifcurlen>=maxlenthenshowmessage('overflow')elsebegintlen:=t.curlen;ifpos>curlenthenpos:=curlen;
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 巨人的花园绘本解析
- 171年伦敦协议书
- 通江人才引进协议书
- 集体买卖树木协议书
- 车位长期出租协议书
- 项目申报代理协议书
- 东营区供热合作协议书
- 销售总监任务协议书
- 鞋子材料购销协议书
- 餐饮合同扣款协议书
- 2025年全国国家版图知识竞赛题库及答案
- 第10课 养成遵纪守法好习惯
- 2025年春人教版英语七年级下册 Unit 7 A Day to Remember(教学设计)
- 数学分析选讲知到智慧树章节测试课后答案2024年秋齐鲁师范学院
- 《船舶管理》助理船副考试复习题库(含答案)
- YAMAHA(雅马哈)贴片机编程培训教材
- 《创伤失血性休克中国急诊专家共识(2023)》解读课件
- 答案-国开电大本科《当代中国政治制度》在线形考(形考任务一)试题
- 创业计划书 创业计划书word文档(三篇)
- 日产汽车奇骏T30原厂维修手册
- Oswestry功能障碍指数问卷表(ODI)(可编辑修改word版)
评论
0/150
提交评论