zoukankan      html  css  js  c++  java
  • 1230-有穷自动机

    #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(); 
        printf("
    ");
    }

  • 相关阅读:
    【BZOJ3193】[JLOI2013]地形生成 DP
    【BZOJ3782】上学路线 组合数+容斥+CRT
    Web安全学习笔记之Kali部署DVWA和OWASPBWA
    Web安全学习笔记之Kali配置国内软件更新源
    Python面试题之列表推导式
    前端学习笔记之HTML中的id,name,class区别
    Web安全学习笔记之Nmap脚本使用指南
    Web安全学习笔记之Nmap扫描原理与用法
    Web安全学习笔记之Openvas配置,使用,报告
    Python面试题之Python中应该使用%还是format来格式化字符串?
  • 原文地址:https://www.cnblogs.com/wangzekai/p/5090136.html
Copyright © 2011-2022 走看看