• 1210-有穷自动机


    #include<stdio.h>
    #include <ctype.h>
    #define ok 1
    #define error 0
    #define MAXREGLUARLONG 40
    #define MAXSTATELONG 40
    #define MAXCAHRSLONG 40
    typedef int state;
    int iCurrentState=0; //初态以1开始
    int iPreState=0;
    int iLastForkState=0;
    int iForkState=0;
    int iMaxState=0;
    char cRegluarSting[MAXREGLUARLONG]; //输入的正规式字符串
    char cCharSet[MAXCAHRSLONG]; //字符集
    int iStateMatrix[MAXSTATELONG][MAXCAHRSLONG]; //状态转换矩阵
    state vStoreRegluarSting()//把字符串读入一个缓冲区中
    {
    scanf("%s",cRegluarSting);
    return ok;
    }
    state vPreProcessRegluarSting()
    //对字符串进行预处理,去掉字符串里面的对分析不产生影响
    {
    int i=0;
    while(cRegluarSting[i]!='')
    {
    if(cRegluarSting[i]=='*')
    {
    int j=i+1;
    while(cRegluarSting[j-1]!='')
    {
    cRegluarSting[j-1]=cRegluarSting[j++];
    }
    }
    i++;
    }
    return ok;
    }
    void vConstructStateMatrix(char cChar,int istate)//构造状态转换矩阵
    {
    int i;
    for(i=0;cCharSet[i]!='';i++)
    if(cChar==cCharSet[i])
    break;
    cCharSet[i]=cChar;
    iStateMatrix[iPreState][i]=istate;
    }
    void vAanalyseRegluarSting()//对字符串进行从左到右的分析与处理
    {
    int i=0;
    for(i=0;cRegluarSting[i]!=0;i++)
    {
    if(cRegluarSting[i]=='(') //NFA出现开始分叉情况
    {
    int iTheFirstl=0;
    int iCharNumBeforl=0;
    iForkState=iCurrentState;
    while(cRegluarSting[i]!=')')
    {
    i++;
    if(isalpha(cRegluarSting[i]))
    {
    if(cRegluarSting[i+1]==')')
    iCurrentState=iLastForkState;
    else
    iCurrentState++;
    iCharNumBeforl++; vConstructStateMatrix(cRegluarSting[i],iCurrentState);
    iPreState=iCurrentState;
    if(iCurrentState>iMaxState)
    iMaxState=iCurrentState;
    }
    if(cRegluarSting[i]=='|')
    {
    iPreState=iForkState;
    if(iTheFirstl==0)
    {
    iLastForkState=iCurrentState;
    iTheFirstl++;
    }
    if(iCharNumBeforl==1&&cRegluarSting[i+2]=='|')
    iCurrentState=iForkState;
    iCharNumBeforl=0;
    }
    if(cRegluarSting[i]==')')
    {
    iPreState=iForkState=iLastForkState;
    iCurrentState=iMaxState;
    }
    }
    }
    else
    {
    if(isalpha(cRegluarSting[i]))
    {
    iCurrentState++; vConstructStateMatrix(cRegluarSting[i],iCurrentState);
    iPreState=iCurrentState;
    if(iCurrentState>iMaxState)
    iMaxState=iCurrentState;
    }
    }
    }
    }
    void vPrintfStateProjectFunction()
    {
    int icCharSetPointer;
    int iPreStatePointer;
    for
    (iPreStatePointer=0;iPreStatePointer<MAXSTATELONG;iPreStatePointer++)
    for(icCharSetPointer=0;icCharSetPointer<MAXSTATELONG;icCharSetPointer++)
    if(iStateMatrix[iPreStatePointer][icCharSetPointer]>0) printf("&(%d,%c)=%d ",iPreStatePointer,cCharSet[icCharSetPointer],iStateMatrix[iPreStatePointer][icCharSetPointer]);
    }
    void vPrintfNfa()//输出NFA
    {
    int iStateNumble;
    int i=0;
    printf("NFA的形式为:(S,$,&,S0,F) 以下为NFA的具体集合内容: ");
    printf("字符集$为:{");
    while(cCharSet[i]!=0)
    if(cCharSet[i+1]==0)
    printf("%c",cCharSet[i++]);
    else
    printf("%c,",cCharSet[i++]);
    printf("} ");
    printf(" 状态集S为:{");
    for (i=0;i<=iMaxState;i++) {
    if(i==iMaxState)
    printf("%d",i);
    else
    printf("%d,",i);
    }
    printf("} ");
    vPrintfStateProjectFunction();
    printf(" 初态集S0为:{0} ");
    printf("终态集F为:{%d}",iMaxState);
    }
    void main()
    {
    vStoreRegluarSting();
    vPreProcessRegluarSting();
    vAanalyseRegluarSting();
    vPrintfNfa();
    }

  • 相关阅读:
    SqlServer执行Insert命令同时判断目标表中是否存在目标数据
    javascript避免dom事件重复触发
    磁盘结构损坏且无法读取
    iframe在iphone中滚动条无效
    Rancher2.x流水线自动化部署
    微服务模块化需要的几个基础功能
    后端程序员的Vue笔记(一)
    自信从何而来
    C#异步案例一则
    Blazor入坑指南
  • 原文地址:https://www.cnblogs.com/babys8023/p/5037210.html
Copyright © 2020-2023  润新知