自动机的构造

自动机的构造这个程序感觉有点难度,代码还在继续完善中。。

  1 #include<stdio.h>
  2 #define N 50
  3 char fx[N][N];        //映射
  4 int verticalqueue[N]; //竖线队列
  5 int front1,next1;     
  6 int starqueue[N];     //星号队列
  7 int front2,next2;
  8 int k;
  9 void judge(int i,char n[],char aph[]);      //把|、*和状态入队列
 10 main()
 11 {
 12     char n[N];                   //接收键盘输入
 13     int i=0;
 14     int j,o;
 15     char x;
 16     char aph[N];
 17     front1=next1=0;
 18     front2=next2=0;
 19     printf("请输入正规式(#号键结束):");
 20     do
 21     {
 22         
 23         scanf("%c",&x);
 24         if(x!='#')
 25         {
 26                 n[i]=x;
 27                 i++;
 28         }
 29     }while(x!='#');
 30     for(j=0;j<N;j++)  aph[j]='~';  
 31     judge(i,n,aph);
 32     for(o=0;o<=N;o++)
 33     for(j=0;j<=k;j++)
 34     {
 35         if(o==0)
 36         {    
 37             fx[0][j+1]=aph[j];
 38             printf("%c",fx[0][j+1]);
 39         }
 40         else fx[o][j]=0;          //初始化fx[][]数组
 41     }
 42     fx[1][0]='x';             //初状态
 43     fx[2][0]='y';             //终止状态
 44 
 45 }
 46 
 47 
 48  
 49 void judge(int i,char n[],char aph[])
 50 {
 51     int j,m;
 52     int x=0;
 53     k=0;
 54     for(j=0;j<i;j++)
 55     {
 56         if(n[j]=='|')
 57         {
 58             verticalqueue[next1]=j;
 59             next1++;
 60         }
 61         if(n[j]=='*')
 62         {
 63             starqueue[next2]=j;
 64             next2++;
 65         }
 66         if(n[j]>='a'&&n[j]<='z')
 67         {
 68             for(m=0;m<i;m++)
 69             {
 70                 if(aph[m]==n[j])  x=1;  //查找该状态是否已在数组里
 71             }
 72                 if(x==0)
 73             {    
 74                 aph[k]=n[j];         //把所有状态存入数组
 75                 k++;                 //k记录状态的个数
 76                     
 77             }
 78         }
 79     }
 80 }
 81 
 82 void fill(int i,char n[],char aph[])
 83 {
 84     int j;
 85     int p,q;      //记录竖线和星号所在的位置 
 86     int p1,q1;
 87     int p2,q2;
 88     int g=1;      //fx[][]的行
 89     int m=1;      //序号
 90     int n=3;
 91     p=q=0;
 92     p1=verticalqueue[front1];   
 93     q1=starqueue[front2]; 
 94     for(j=0;j<=i;j++)
 95     {
 96         p2=verticalqueue[front1];      //把第一个竖线所在的位置提取出来
 97         q2=starqueue[front2];          //把第一个星号所在的位置提取出来
 98 
 99         if(p2<q2)                       //竖线在前面
100         {
101             while((p<p1)&&(g<=k))         //竖线的前半部分
102             {
103                 if(n[p]==fx[0][g])
104                 {
105                     fx[g][p]=m;
106                 }
107                 p++;
108                 g++;
109             }
110 
111         }
112 
113         
114         else if(p2>q2)        //竖线在后面
115         {
116             while((p<p1)&&(g<=k))         //竖线的前半部分
117             {
118                 if(n[p]==fx[0][g])
119                 {
120                     fx[g][p]=m;
121                     fx[n][0]=m;
122                 }
123                 n++;
124             //    p++;
125             //    g++;
126             }
127             fx[g][p]
128         }
129         p1=verticalqueue[front1];   
130         q1=starqueue[front2]; 
131         front1++;
132         front2++;
133     }
134 
135 }

 

posted @ 2016-11-27 22:25  247李嘉嘉  阅读(316)  评论(0编辑  收藏  举报