改进后的NFA(没有括号的情况)
#include<stdio.h> #define MAX 1000 void lianjie(int s,int e,int n ,char input[]); int p=2; main() { char input[MAX]; long i=0; long n; char getinput; printf("input:"); do { getinput=getchar(); input[i]=getinput; i++; }while(getinput!='#'); n=i; nfa(0,1,0,n-2,input); printf("\n"); printf("%d",n); printf("\n"); } void nfa(int start,int end ,int s,int e,char input[]) { if(s==e) { if(input[s+1]=='#'||input[s+1]=='|') { printf("f(%d,%c)=1\n",start,input[s]); } else { printf("f(%d,%c)=%d\n",start,input[s],end); p++; } } else{ int k=findlow(s,e,input); if(input[k]=='|') { nfa(start,end,s,k-1,input); nfa(start,end,k+1,e,input); } else if(input[k]=='.') { nfa(start,p,s,k-1,input); nfa(p-1,p,k+1,e,input); } else if(input[k]=='*') { printf("f(%d,~)=%d\n",start,p); printf("f(%d,%c)=%d\n",p,input[k-1],p); if(input[s+2]=='#'||input[s+2]=='|') { printf("f(%d,~)=1\n",p); } else { p++; printf("f(%d,~)=%d\n",p-1,p); } p++; } } } int findlow(int s,int e ,char input[]) { int i=s; int k=i; int weight=0; while(i<=e) { if(input[i]=='|'&&weight<3) { k=i; weight=3; } else if(input[i]=='.'&&weight<2) { k=i; weight=2; } else if(input[i]=='*'&&weight<1) { k=i; weight=1; } i++; } return k; }