第4章 串存储与基本操作的实现
n=12,num=32 Index_KMP:
n=12,num=25
4.4应用举例
【例4.2】应用BF模式匹配函数IndexBF_SS(S,T,pos)实现算法:
int Replace_S(SString &S,SString T,SString V)
该函数的功能是,将定长存储串S中的所有子串T用定长串V来替换。如果操作成功函数返回值1,否则返回值0。 算法思想
假设模式串T的长度为lt,替换串V的长度为lv,先从pos=1的位置开始查找T在S中出现的位置n,如果操作成功,则将S中第n个开始lt个字符替换为串值V,并且pos=n+lv,继续开始下一轮的查找和替换过程,直到查找失败为止。 算法实现
int Replace_S(SString &S,SString T,SString V) { int n,pos=1; int lt=Length_SS(T),lv=Length_SS(V); while(n=IndexBF_SS(S,T,pos)) { if(!Replace_SS(S,n,lt,V))return 0; pos=n+lv; } return 1; }
【例4.3】应用BF模式匹配函数IndexBF_SS(S,T,pos)实现算法:
int Replace_H(HString &S,HString T,HString V)
该函数的功能是,将堆分配存储串S中的所有子串T用堆分配存储串V来替换。如果操作成功函数返回值1,否则返回值0。
int Replace_H(HString &S,HString T, HString V) { int n,pos=1,lt=T.length,lv=V.length; while(n=IndexBF_SS(S.ch,T.ch,pos)) { if(!Replace_HS(S,n,lt,V)) return 0; pos=n+lv; } return 1; } 演示程序代码
串替换函数Replace_S()、Replace_H()的函数调用演示程序 void main () {
-.87.-
第4章 串存储与基本操作的实现
SString S1,T1,V1; HString S2,T2,V2; cout<<\《串替换函数演示程序》:\\n\ cout<<\ cout<<\ cout<<\ StrAssign_HS(S2,S1); StrAssign_HS(T2,T1); StrAssign_HS(V2,V1); if(Replace_S(S1,T1,V1)) cout<<\定长替换结果为:\\n\ else cout<<\定长替换失败!\\n\ if(Replace_H(S2,T2,V2)) cout<<\堆分配替换结果为:\\n\ else cout<<\堆分配替换失败!\\n\}(程序运行结果略)
【例4.4】编程计算定长存储串S中所含不同字符的总数以及该串中每个字符的个数。 算法思想
首先定义结构体类型:struct num{char ch;int n;};以及该类型的数组a[],其中ch表示字符串S中的不同字符,n表示字符出现的次数。再对串S中的每个字符ch,在数组a中逐个扫描,如果查找成功,相应的字符数加1,否则在a中添加一个新字符,其个数置为1。 算法实现
void ch_num() { SString S; struct num{char ch;int n;}; num a[MAXLEN]; int i=0,j,k=0; char ch; cout<<\输入一个字符串:\\n\ cin.getline(S,MAXLEN); while(ch=S[i++]) { for(j=0;j -.88.- 第4章 串存储与基本操作的实现 4.5习 题 一、简答题 1.串和空串有和不同? 2.两个字符串相等的充要条件是什么? 3.串的3种存储表示方法是什么? 4.分别写出下面各个模式串的next数组: (1)aaabcaab (2)abcabca (3)babbabab (4)abcaabbabcabaac 5.设s=”I AM A STUDENT”,t=”GOOD”,q=”WORKER”,下面各个操作的结果是什么? (1) StrLength(s);(2) StrLength(t);(3) SubString(s,8,7);(4) SubString(t,2,1);(5) Index(s,”A”);(6) Index(s,t);(7) Replace(s,”STUDENT”,q);(8) Concat(SubString(s,6,2),Concat(t,SubString(s,7,8)))。 6.执行以下函数的显示结果是什么? void demonstrate(){ StrAssign(s,”THIS IS A BOOK”); Replace(s,SubString(s,3,7),”ESE ARE”); StrAssign(t,Concat(s,”S”)); StrAssign(u,”XYXYXYXYXYXY”); StrAssign(v,SubString(u,6,3); StrAssign(w,”W”); Printf(“%s%s%s%s%s%s”,”t=”,t,”,v=”,v,”,u=”,Replace(u,v,w)); } 二、填空题 1.串是一种特殊的线性表,其特殊性主要体现在( )。 2.设有两个串P和Q,那么求Q在P中首次出现的位置的运算被称为( )。 3.设串S=”I AM A TEACHER”,那么S的长度为( )。 4.设S1=“abcdefg”,S2=“pqrst”,函数Con(x,y)返回x和y的连接串,Subs(S,i,j)返回S中从i个字符开始的j个字符组成的子串,Len(S)返回S的长度,则Con(Subs(S1,2,Len(S2)),Subs(S1,Len(S2),2))的结果是( )。 5.在串模式匹配的BF算法中,如果主串S=“ababcabcacbab”,模式串T=“abcac”,匹配过程中的元素比较次数为( )次,如果用KMP算法,其比较次数为( )次。 6.模式p1=”abaabcac”的next函数值序列是( );模式p2=”abcaabbabcab”的next函数值序列是( )。 三、解答题 1.设串以堆分配方式存储,设计一个判等操作的算法Equal(S,T),如果S与T相等则函数返回1,否则返回0值。 2.设串以定长顺序存储,设计一个串复制操作的算法CopyStr(S,T),将T的内容复制到S。 3.编写一个算法SubsNum(S,T),返回串T在S中重复出现的次数(子串不能重叠)。 4.编写一个算法MaxNext(T,&m,&n),该操作计算T中出现的第一个最长重复子串的位置m及其长度n。 -.89.- 第4章 串存储与基本操作的实现 5.假定串以堆分配方式存储,编写一个实现串通配符匹配的函数Pattern_Index(S,T),其中通配符只有???,它可以和任一个字符匹配成功。 6.设串以堆分配方式存储,设计一个串置换操作的算法Replace(S,T,X)。该操作将S中所有不重复的子串T替换为串X。 7.假定串以定长顺序存储,设计一个求最长公共子串的算法MaxSubs(S,T,&m,&n)。该操作返回S、T的最长公共子串在S中首次出现的开始位置m和长度n。 4.6 上机实验 本章上机实验的主要目的在于使学生熟悉掌握串类型数据的实现方法和文本模式匹配方法,熟悉文字处理软件的基本设计方法,以及对于较为复杂问题的分解求精方法。 实验题目 串基本操作的演示 【问题描述】 定义一个串数据类型,并在此基础上编写设计一个串的基本操作演示系统。 【基本要求】 用堆分配存储结构实现对HString串类型数据的最小操作子集,并在此基础上进一步实现关于串的其它较为复杂的操作。 利用串的基本操作函数构造一个串处理系统,该系统循环往复地处理用户输入的每一条命令,直至出现终止程序的命令为止。系统具有以下基本功能: (1)串赋值;(2)判断两个串是否相等;(3)串联接;(4)求串的长度;(5)求子串;(6)子串定位;(7)串替换;(8)显示串内容;(9)串删除;(10)退出。 在该系统的执行过程中,如果在命令行中输入的是一个串常量,则应首先建立它。基本操作函数的结果(即函数值)如果是一个串,则应在尚未分配的区域内重新分配空间存放。 【测试数据】 由设计者自行指定。 【实现提示】 (1)串的数据类型HString应定义为: struct HString { char *ch; //串变量中字符数组的首地址 int length; //串的长度 }; (2)演示系统的主结构是一个串头表StrHeadList,可定义为: struct StrHeadList { HString StrHead[100]; //100为串数目的最大值 int CurNum; //当前系统中串的总数 }; 系统在执行过程中,将各个串的头指针依次存储与串头数组StrHead中(假定串的数目不超过100)。CurNum为系统中现有的串数目,CurNum+1是可为下一个新串头指针分配的位置。 -.90.-