| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 710 人关注过本帖
标题:模式匹配
只看楼主 加入收藏
烈烈水云天
Rank: 2
来 自:湖南
等 级:论坛游民
帖 子:56
专家分:33
注 册:2009-12-30
结帖率:100%
收藏
 问题点数:0 回复次数:0 
模式匹配
#include"stdio.h"
#include"string.h"
#define M 100
#define N 25
#define L 24
int flink[N];/*存储失败连接值*/
int d[L];/*存储函数d(x)的值*/

int menuSelect()/*菜单函数*/
{
    int x;
    printf("~~~~~~~~~模式匹配~~~~~~~~~~~\n");
    printf("    0.退出                     \n");
    printf("    1.简单模式匹配             \n");
    printf("    2.KMP模式匹配            \n");
    printf("    3.BM模式匹配             \n");
    printf("请选择方法:");
    scanf("%d",&x);
    return(x);
}

int strlength(char s[])/*计算串长函数*/
{
    int i;
    for(i=0;s[i]!='\0';i++);
        return(i);
}

void simple_match(char t[],char p[])/*简单的模式匹配函数*/
{
    int i,j,l,m,x;
    int k=0;
    l=strlength(t);
    m=strlength(p);
    for(i=0;i<=l-m;i++)
    {
        for(j=0,x=i;j<m&&t[x]==p[j];x++,j++)
            if(j+1==m) k=1;
            
        if(k==1) break;
    }
   
    if(k==1)
        printf("匹配成功,位置位于第%d个字符\n",i+1);
    else
        printf("匹配失败\n");
        
    printf("fanhui\n");
    getch();
}

void faillink(char p[])/*求失败连接值的函数*/
{
    int j=1;
    int k,i,x;
    x=strlength(p);
    flink[0]=-1;
    while(j<x)
    {
        k=flink[j-1];
        
        while(k!=-1&&p[k]!=p[j-1])
            k=flink[k];
            
        flink[j]=k+1;
        j++;
    }
}

void kmp_match(char t[],char p[])/*KMP模式匹配算法函数*/
{
    int i,j,l,m,k;
    l=strlength(t);
    m=strlength(p);
    i=0;
    j=0;
    k=0;
    faillink(p);
    while(i<l)
    {
        while(j!=-1&&p[j]!=t[i])
        j=flink[j];
        if(j==m-1)
        {
            k=1;
            break;
        }
        i++;j++;
    }
   
    if(k==1)
        printf("匹配成功,位置位于第%d个字符\n",i-m+2);
    else
        printf("匹配失败\n");
        
    printf("fanhui\n");
    getch();
}

void dx(char p[])/*求d(x)函数*/
{
    int i,m;
    m=strlength(p);
   
    for(i=0;i<L;i++)
        d[i]=m;
        
    for(i=0;i<m-1;i++)  
        d[p[i]-'a']=m-i-1;
}

void bm_match(char t[],char p[])/*求BM模式匹配函数*/
{
    int i,j,k,l,m,x=0;
    l=strlength(t);
    m=strlength(p);
    dx(p);
    i=m-1;
    do
    {
        j=m-1;
        k=i;
        while(j>=0&&p[j]==t[k])
        {
            j--;
            k--;
        }
        
        if(j<0)
        {
            x=1;
            break;
        }
        i+=d[t[i]-'a'];
    }while(i<l);
   
    if(x==1) printf("匹配成功,位置位于第%d个字符\n",i-m+2);
    else printf("匹配失败\n");   
}
main()
{
    char T[M],P[N];
    int i;
    printf("请输入主串和模式串\n");
    gets(T);gets(P);
    for(i=1;i!=0;)
    {
        i=menuSelect();
        switch(i)
        {
            case 0:;break;
            case 1:simple_match(T,P);break;/*进行简单的模式匹配*/
            case 2:kmp_match(T,P);break;/*进行KMP模式匹配*/
            case 3:bm_match(T,P);break;/*进行BM模式匹配*/
        }
    }
}
搜索更多相关主题的帖子: 模式 
2010-01-06 10:44
快速回复:模式匹配
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.026681 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved