自动机的构造这个程序感觉有点难度,代码还在继续完善中。。
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 }