• 有限自动机的构造与识别


    一、实验目标  
    1、掌握有穷状态自动机的概念;  
    2、掌握有穷状态自动机的存储及表示方法;
    3、掌握有穷状态自动机与正则式之间的关系。

    二、实验要求
    1、输入正规式;
    2、构造该正规式的有穷状态自动机;
    3. 以五元组形式输出。

    三、实验代码

    #include<iostream> 
    #include<string> 
    #include<vector> 
    using namespace std; 
    #define max 100 
    struct edge{  
    string first;
    string change;
    string last;
    };  
    int N;
    vector<int> value;
    string closure(string a,edge *b) 
    { int i,j; 
    for(i=0;i<a.length();i++) 
    { 
    for(j=0;j<N;j++) 
    { 
    if(b[j].first[0]==a[i]&&b[j].change=="&") 
    { 
    a=a+b[j].last[0];  
    }  
    }  
    } 
    return a;  
    }  
    string move(string jihe,char ch,edge *b) 
    { 
    int i,j; 
    string s="";  
    for(i=0;i<jihe.length();i++)  
    { 
     for(j=0;j<N;j++)
    { 
    if(b[j].first[0]==jihe[i]&&b[j].change[0]==ch) 
    s=s+b[j].last;  
    }  
    }  
    return s;  
    } 
    string sort(string t) 
    { 
    int k,i,j; 
    char tt;  
    for(i=0;i<t.length()-1;i++) 
    { 
    k=i;  
    for(j=i+1;j<t.length();j++) 
    { 
    if(t[j]<t[k])k=j;  
    }  
    tt=t[k];t[k]=t[i];t[i]=tt;  
    } 
    return t;
    } 
    void main() 
    {  
    int i,j,x=0,h,length,m,d=0; 
    string Change;
    string First,Last;
    string T[max],ss; 
    edge *b=new edge[max];  
    cout<<"请输入各边信息:起点条件(空用&表示)终点,以输入#结束。"<<endl; 
    for(i=0;i<max;i++) 
    { 
    cin>>b[i].first; 
    if(b[i].first=="#")break; 
    else 
     cin>>b[i].change>>b[i].last; 
    } 
    N=i;  
    cout<<"请输入该NFA的初态及终态:"<<endl; 
    cin>>First>>Last;  
    cout<<"请输入此NFA状态中的输入符号即边上的条件:"<<endl; 
    cin>>Change;  
    T[x]=closure(First,b); 
    T[x]=sort(T[x]); 
    value.push_back(0); 
    i=0;  
    while(value[i]==0&&value.size()) 
    { 
    value[i]=1;  
    for(j=0;j<Change.length();j++) 
    { 
    ss="";  
    ss=move(T[i],Change[j],b); 
    length=value.size(); 
     
    for(h=0;h<length;h++) 
    {  
     if(T[h]==sort(closure(ss,b)))break; 
    }  
    if(h==length) 
    { 
    T[++x]=sort(closure(ss,b)); 
    value.push_back(0);  
     }
    } 
    i++; 
    }  
    edge *DFA=new edge[max];  
    for(i=0;i<=x;i++)
    { 
    for(j=0;j<Change.length();j++) 
    { 
    DFA[d].first=T[i]; 
    DFA[d].change=Change[j]; 
    ss="";  
    ss=sort(closure(move(T[i],Change[j],b),b)); 
    for(m=0;m<=x;m++) 
    if(ss==T[m])DFA[d++].last=T[m];  
    }  
    }  
    cout<<"此NFA构造的DFA的各边信息如下:"<<endl<<"起点条件终点"<<endl; 
    for(i=0;i<d;i++) 
    {
    for(m=0;m<=x;m++) 
    { 
    if(DFA[i].first==T[m])cout<<m<<" "<<DFA[i].change;  
    }
    for(m=0;m<=x;m++)  
    if(DFA[i].last==T[m])cout<<" "<<m<<endl;; 
    }  
    cout<<"该DFA的初态为:"; 
    for(m=0;m<=x;m++) 
    { 
    for(j=0;j<T[m].length();j++) 
    { 
    ss=T[m];  
    if(ss[j]==First[0])cout<<m<<endl;  
     
    }  
    }  
    cout<<"该DFA的终态为:"; 
    for(m=0;m<=x;m++) 
    { 
    for(j=0;j<T[m].length();j++) 
    { 
    ss=T[m];  
    if(ss[j]==Last[0])cout<<m<<"  "; 
    }  
    } 
    cout<<endl; 
    system("pause");  
    } 
  • 相关阅读:
    linux-shell编程-1-简介
    linux-tail
    linux-grep
    linux-sort
    linux-sed
    linux-awk
    函数调用
    选择结构和循环结构
    列表字典集合常用函数
    datetime模块
  • 原文地址:https://www.cnblogs.com/xuyizhu/p/6101625.html
Copyright © 2020-2023  润新知