if(NODE.find(a[i])>NODE.find(a[i+1]))
{
b=a[i];
a[i]=a[i+1];
a[i+1]=b;
}
}
voideclouse(charc,string&he,edgeb[])
{
intk;
for(k=0;k{
if(c==b[k].first[0])
if(b[k].change=="*")
{
if(he.find(b[k].last)>he.length())
he+=b[k].last;
eclouse(b[k].last[0],he,b);
}
}
}
voidmove(chan&he,intm,edgeb[])
{
inti,j,k,l;
k=he.ltab.length();
l=he.jihe[m].length();
for(i=0;i for(j=0;j if((CHANGE[m]==b[j].change[0])&&(he.ltab[i]==b[j].first[0]))
if(he.jihe[m].find(b[j].last[0])>he.jihe[m].length())
he.jihe[m]+=b[j].last[0];
for(i=0;i for(j=0;j if((CHANGE[m]==b[j].change[0])&&(he.jihe[m][i]==b[j].first[0]))
if(he.jihe[m].find(b[j].last[0])>he.jihe[m].length())
he.jihe[m]+=b[j].last[0];
}
//输出
voidoutputfa(intlen,inth,chan*t)
{
inti,j,m;
cout<<"I ";
for(i=0;i cout<<'I'<cout<for(i=0;i{
cout<<''< m=t[i].ltab.length();
for(j=0;j {
kong(8-m);
m=t[i].jihe[j].length();
cout< }
cout<}
}
voidmain()
{
edge*b=newedge[MAXS];
inti,j,k,m,n,h,x,y,len;
boolflag;
stringjh[MAXS],endnode,ednode,sta;
cout<<"请输入NFA各边信息(起点条件[空为*]终点),以#终止:
"<for(i=0;i{
cin>>b[i].first;
if(b[i].first=="#")break;
cin>>b[i].change>>b[i].last;
}
N=i;
/*for(j=0;j cout<
for(i=0;i{
if(NODE.find(b[i].first)>NODE.length())
NODE+=b[i].first;
if(NODE.find(b[i].last)>NODE.length())
NODE+=b[i].last;
if((CHANGE.find(b[i].change)>CHANGE.length())&&(b[i].change!
="*"))
CHANGE+=b[i].change;
}
len=CHANGE.length();
cout<<"结点中属于终态的是:
"<cin>>endnode;
for(i=0;i if(NODE.find(endnode[i])>NODE.length())
{
cout<<"所输终态不在集合中,错误!
"< return;
}
//cout<<"endnode="<chan*t=newchan[MAXS];
t[0].ltab=b[0].first;
h=1;
eclouse(b[0].first[0],t[0].ltab,b); //求e-clouse
//cout<for(i=0;i{
for(j=0;j for(m=0;m eclouse(t[i].ltab[j],t[i].jihe[m],b); //求e-clouse
for(k=0;k {
//cout<";
move(t[i],k,b); //求move(I,a)
//cout< for(j=0;j eclouse(t[i].jihe[k][j],t[i].jihe[k],b);//求e-clouse
}
for(j=0;j {
paixu(t[i].jihe[j]); //对集合排序以便比较
for(k=0;k {
flag=operator==(t[k].ltab,t[i].jihe[j]);
if(flag)
break;
}
if(!
flag&&t[i].jihe[j].length())
t[h++].ltab=t[i].jihe[j];
}
}
cout<"<outputfa(len,h,t); //输出状态转换矩阵
//状态重新命名
string*d=newstring[h];
NODE.erase();
cout<"<for(i=0;i{
sta=t[i].ltab;
t[i].ltab.erase();
t[i].ltab='A'+i;
NODE+=t[i].ltab;
cout<<'{'< for(j=0;j if(sta.find(endnode[j]) d[1]=ednode+=t[i].ltab;
for(k=0;k for(m=0;m if(sta==t[k].jihe[m])
t[k].jihe[m]=t[i].ltab;
}
for(i=0;i if(ednode.find(NODE[i])>ednode.length())
d[0]+=NODE[i];
endnode=ednode;
cout<"<outputfa(len,h,t); //输出DFA
cout<<"其中终态为:
"<//DFA最小化
m=2;
sta.erase();
flag=0;
for(i=0;i{
//cout<<"d["<
for(k=0;k {
//cout<<"I"< y=m;
for(j=0;j {
for(n=0;n {
if(d[n].find(t[NODE.find(d[i][j])].jihe[k]) {
if(t[NODE.find(d[i][j])].jihe[k].length()==0)
x=m;
else
x=n;
if(!
sta.length())
{
sta+=x+48;
}
else
if(sta[0]!
=x+48)
{
d[m]+=d[i][j];
flag=1;
d[i].erase(j,1);
//cout< j--;
}
break;//跳出n
}
}//n
}//j
if(flag)
{
m++;
flag=0;
}
//cout<<"sta="< sta.erase();
}//k
}//i
cout<";
for(i=0;i cout<<"{"<cout<//状态重新命名
chan*md=newchan[m];
NODE.erase();
cout<"<for(i=0;i{
md[i].ltab='A'+i;
NODE+=md[i].ltab;
cout<<"{"<}
for(i=0;i for(k=0;k for(j=0;j {
if(d[i][0]==t[j].ltab[0])
{
for(n=0;n {
if(!
t[j].jihe[k].length())
break;
else
if(d[n].find(t[j].jihe[k]) {
md[i].jihe[k]=md[n].ltab;
break;
}
}
break;
}
}
ednode.erase();
for(i=0;i for(j=0;j if(d[i].find(endnode[j]) ednode+=md[i].ltab;
endnode=ednode;
cout<"<outputfa(len,m,md);
cout<<"其中终态为:
"<}
/////////////////////////////////
测试数据:
i*1
1a1
1b1
1*2
2a3
2b4
3a5
4b5
5*6
6a6
6b6
6*f
#
f
////////////////////////////////
运行结果:
请输入NFA各边信息(起点条件[空为*]终点),以#终止:
i*1
1a1
1b1
1*2
2a3
2b4
3a5
4b5
5*6
6a6
6b6
6*f
#
结点中属于终态的是:
f
状态转换矩阵如下:
I Ia Ib
-------------------------
i12 123 124
123 12356f124
124 123 12456f
12356f12356f1246f
12456f1236f 12456f
1246f 1236f 12456f
1236f 12356f1246f
重命名:
{i12}=A
{123}=B
{124}=C
{12356f}=D
{12456f}=E
{1246f}=F
{1236f}=G
DFA如下:
I Ia Ib
-------------------------
A B C
B D C
C B E
D D F
E G E
F G E
G D F
其中终态为:
DEFG
集合划分:
{A}{DEFG}{B}{C}
重命名:
{A}=A
{DEFG}=B
{B}=C
{C}=D
最小化DFA如下:
I Ia Ib
-------------------------
A C D
B B B
C B D
D C B
其中终态为:
B