数据结构实验报告串与模式匹配.docx

上传人:b****7 文档编号:8737057 上传时间:2023-02-01 格式:DOCX 页数:13 大小:17.82KB
下载 相关 举报
数据结构实验报告串与模式匹配.docx_第1页
第1页 / 共13页
数据结构实验报告串与模式匹配.docx_第2页
第2页 / 共13页
数据结构实验报告串与模式匹配.docx_第3页
第3页 / 共13页
数据结构实验报告串与模式匹配.docx_第4页
第4页 / 共13页
数据结构实验报告串与模式匹配.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

数据结构实验报告串与模式匹配.docx

《数据结构实验报告串与模式匹配.docx》由会员分享,可在线阅读,更多相关《数据结构实验报告串与模式匹配.docx(13页珍藏版)》请在冰豆网上搜索。

数据结构实验报告串与模式匹配.docx

数据结构实验报告串与模式匹配

数据结构实验报告

实验名称

班级

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;j

    t[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;m

    s2[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=ax

    ts3-bcdcfaliefg

    sl和串s2连接起来而产生串S4$s4=xsfzaxyzghefghijklmn

    实验结果分析:

     

  • 展开阅读全文
    相关资源
    猜你喜欢
    相关搜索

    当前位置:首页 > PPT模板 > 动态背景

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

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