数据结构实验报告串与模式匹配.docx
《数据结构实验报告串与模式匹配.docx》由会员分享,可在线阅读,更多相关《数据结构实验报告串与模式匹配.docx(13页珍藏版)》请在冰豆网上搜索。
数据结构实验报告串与模式匹配
数据结构实验报告
实验名称
串
班级
0901
姓名
髙傲
学号
20091185015
日期
2011128
实验目的:
(1)掌握顺序串的各种基本运算
(2)掌握模式匹配算法
实验内容:
2.1编写一个程序algo3-l.cpp,实现顺序串的各种基本运算,并在此基础上设讣一个主函数完成如下功能:
(1)建立串s=wabcdefghefghijklmnw和串sWxyz";
(2)输出串s:
(3)输出串s的长度:
(4)在串s的第9个字符位置插入串si而产生串s2:
(5)输出串s2:
(6)删除串s第2个字符开始的5个字符而产生串s2:
(7)输出串s2:
(8)将串s第2个字符开始的5个字符替换成串si而产生串s2:
(9)输出和串s2.
(10)提取串s的第2个字符开始的10个字符而产生串S3:
(11)输出串S3:
(22)将串si和串s2连接起来而产生串s4:
(13)输出串s4.
程序源代码:
2.1的源程序:
Sinclude
SdefineMAXSIZE256//chars[MAXSIZE];
//求串长
intStrLength(char*s){
inti二0;
while(s[i]!
='\0')
i++;
return(i);
}
//串联接
intStrConcat(char*si,char*s2,char*s)
{
inti二0,j,lenlFlen2;
lenl=StrLength(sl);
len2=StrLength(s2);
if(lenl+len2>MAXSIZE-1)
return(0);
j二0;
wh订e(sl[j]!
=\or)
{
s[i]=sl[j];
i++;
j++;
}
j二0;while(s2[j]!
=\0F)
{
s[i]=s2[j];
i++;
j++;
}
s[i]二P;
return
(1);
}
//求子串
intStrSub(char*tfchar*s,inti,intlen){
intslen,j;slen=StrLength(s);
if(i
slenlen<0len>slen-i+l)printf(-参数不对0;return(0);}for(j=0;jt[j]=s[i+j-l];
t[j]=\0';
return
(1);
}
//串比较
intStrCmp(char*sl,char*s2)
{
inti二0;
while(sl[i]=s2[i]&&sl[i]!
='\0')i++;
return(sl[i]二二s2[i]);
}
//输岀串
voidDisp_Str(char*s)
{
inti;
for(i=0;i{
printfs[i]);
}printf("\n");
}
〃插入串并保存到新串中
intStrinsert(char*s,char*si,inti,char*s2){
intj二0,k,lensl,lens;lens=StrLength(s);
lensl=StrLength(si);
for(k=0;k{s2[j]=s[k];
j++;
}
for(int1=0;Klensl;1++)
{
s2[j]=sl[l];
j++;
}
for(intm二k;ms2[j]=s[m];j++;
}
s2[j]二'\0';
return
(1);
}
〃删除串中元素并保存到新串中
intStrDelete(char*s,char*s2,inta,intb){
inti二0,lens=StrLength(s);
for(intj二0;j<(a-1);j++)
{
s2[i]=s[j];
i++;
}
for(intk=(a+b-l);k{
s2[i]=s[k];
i++;
}
s2[i]=\0';
return
(1);
}
〃用一个串替代另一个串中部分字符并保存到新串中
intTiDaiStr(char*s,char*si,char*s2,inta,intb){
inti二0,lens,lensl;lens=StrLength(s);lensl=StrLength(si);
for(intj二0;j{
s2[i]=s[j];
i++;
}
for(intk=0;k{
s2[i]=sl[k];
i++;
}
for(intl=(a+b-1);Klens;1++){
s2[i]=s[l];
i++;
}
s2[i]=\0';
return
(1);
}
intmain(void)
{
printfC
(1)建立串s=abcdefghefghijklmn和sl=xyz\n?
,);
chars〔MAXSIZE]=,zabcdefghefghijklmn^;
charsi[MAXSIZE]二〃xyz";
printfC
(2)输出串s二");
Disp_Str(s);
printf(,z(3)输出串s的长度:
%d\n*»StrLength(s));
printfC(4)在串s的第9个字符位置插入串si而产生s2\n");
chars2[MAXSIZE];
Strinsert(s,si,9,s2);
printfC(5)输出串s2二");
Disp_Str(s2);
printfC(6)删除串s第2个字符开始的5个字符而产生串s2\n");
StrDelete(s,s2,2,5);
printf(,?
(7)输出串s2:
");
Disp_Str(s2);
printf("(8)将串s第2个字符开始的5个字符替换成串si而产生串s2\n");
TiDaiStr(s,si,s2,2,5);
printfC(9)输出s2二");
Disp_Str(s2);
printf(w(10)提取串s的第2个字符开始的10个字符而产生串s3\n");
printf(*(11)输岀s3二");
chars3[MAXSIZE];
StrSub(s3,s,2,10);
Disp_Str(s3);
printfC(12)将串si和串s2连接起来而产生串s4\n");
chars4[MAXSIZE];
StrConcat(si,s2ts4);
printfC(13)输岀串s4O;
Disp_Str(s4);
getchar0;
return(0);
}
2.2
#include
#definemaxsize256chars[maxsize];chart[100];
intnext[maxsize];
//求串长
intStrLength(char*s)
{
inti二0;
while(s[i]!
='\0‘)
i++;
return(i);
}
intChange(char*s)
{
inti;
for(i=StrLength(s)-1;i>=0;i--){
s[i+l]=s[i];
}
s[0]=StrLength(s);
return
(1);
}
//简单模式匹配
intStrIndex_Bf(char*s,char*t)
{
inti=l,j=l;
while(i<=s[O]&&j<=t[O])
if(s[i]=t[jj)
{
i++;
j卄;
}
else
{
i=i-j+2;
j二1;
}
辻G〉t[o])
return(i-t.O]);
else
returnT;
}
//输岀next值
intDis_next(intnext[],char*t)
inti;
for(i=l;i<=t[0];i++)
printf(z/%dz,,nextZiJ);
}
printf("\n");
returnnext[i];
}
//模式串求next值
voidGetnext(char*t,intnext[])
{
inti=l,j=0;
next[l]=0;
wh订e(i〈t[0])
{
if(j=0
{
++i;
++J;
nextLiJ=j;
}
else
j=next[j];
}
}
〃采用KMP算法求t在s中的位苣
intSerIndex_KMP(char*s,char*t,intpos,intnext[]){
inti=pos,j=l;
while(i<=s[O]&&j<=t[Oj)
if(j=O|s[i]==t[j])
{
i++;
j++;
}
else
j=next[j];
if(j>t[O])
return
else
returnT;
intmain(void)
printfC
(1)建立abcabcdabcdeabcdefabcdefg目标串s和abcdeabcdefab模式串t\n");
chars匚=/,abcabcdabcdeabcdefabcdefg/";
chart[」=?
/abcdeabcdefabz,;
Change(s);
Change(t);
printf("
(2)简单模式匹配求t在s中的位置:
%d\n",StrIndex_Bf(s,t));
printf(,z(3)由模式串t求出next值next二");
intnext[maxsize」;
Getnext(t,next);
Dis_next(next,t);
printfC(4)采用KMP算法求t在s中的位置:
%d\n^,Serlndex.KMP(s,t,1,next));
}
2.2源程序:
#include
#definemaxsize256
chars[maxsize];
chart[100];
intnext[maxsize];
//求串长
intStrLength(char*s)
{
inti二0;
wh订e(s[i]!
='\0‘)
i++;
return(i);
}
intChange(char*s)
{
inti;
for(i=StrLength(s)-1;i>=0;i―)
{
s[i+l]=s[i];
}
sE0]=StrLength(s);
return
(1);
}
//简单模式匹配
intStrIndex_Bf(char*s,char*t)
{
inti=l,j=l;
while(i<=s[0]&&j<=t[01)
if(s[i]=t[jl)
{
i++;j卄;
}
else
{
i=i-j+2;
j=l;
}
辻(j>t[O])
return(i-t[0]);else
return-1;
}
//输岀next值
intDis_next(intnext[],char*t){
inti;
for(i=l;i<=t[0];i++)
{
printf(,z%d/z,nextLi]);
}
printf("\n");returnnext[i];
}
//模式串求next值
voidGetnext(char*t,intnext[]){
inti=l,j=0;
next[l]=0;while(i{
if(j=Ot[i]==t[j])
{
++i;
++J;
next[i]=j;
}
elsej=next[j];
}//采用KMP算法求t在s中的位置intSerIndex_KMP(char*s,char*t,intpos,intnext[])
{
inti=pos,j=l;
while(i<=s[0]&&j<=t[0])
if(j=0|s[i]==t[j])
{
i++;
j++;
}
else
j=next[j];
辻(j>t[ol)
returni-t;
else
return-1;
}
intmain(void)
{
printfC
(1)建立abcabcdabcdeabcdefabcdefg目标串s和abcdeabcdefab模式串t\n");
chars[]^abcabcdabcdeabcdefabcdefg'';
char二"abcdeabcdefab";
Change(s);
Change(t);
printf("
(2)简单模式匹配求t在s中的位置:
%d\n",StrIndex_Bf(s,t));
printf(,?
(3)由模式串t求岀next值next二");
intnext[maxsize^;
Getnext(t,next);
Dis_next(next,t);
printfC(4)采用KMP算法求t在s中的位置:
%d\n?
z,SerIndex_KMP(s,t,1,next));chargetchar0;
return(0);
运行结果:
»H振结沟实验\chuan\aIgo2-l.exe
〉建?
7串cdiefuhi/iklmn和si
<2啪出串r:
-二j"z小一<3〉鐘出串3的长度:
:
<4>#Ss的第9个宇符位畫插入串"而产生s2⑸锚「亠<6〉製瞬吳第2个字符开始的5个字符而产生串s2:
證輝s'第2个字符刑召的5个字符替换成呂si而产生串s2(9〉输__...
<10>W串3的第2个字符开始的但个字符而产生串品
CJL2〉桜年"3〉输出
=xyze=ahcdefghefghijklmn
18
s2=abcdefghxyzefghijklmn
s2:
aghefghijkInn亠/S立怎#也•
s2=axts3-bcdcfaliefg
sl和串s2连接起来而产生串S4$s4=xsfzaxyzghefghijklmn
实验结果分析: