前文回顾
算法
来自龙书第二版
C++实现
#include<iostream>
#include<string>
#include<cstring>
#include<vector>
#include<algorithm>
#define MAX_TRANS 100
using namespace std;
vector<char>characters;//输入字符集
int DFA_state_number=0;//DFA中状态数量
vector<vector<int>>transition(MAX_TRANS);//记录终态的名称变化(一对多)
int final_count=0;//终态数量
int trans_count=0;//transition大小
//得到的状态集合
struct States
{
vector<int>jset;
};
//DFA状态转换关系
struct relation
{
States* pre;
char jchar;
States* next;
};
//得到s闭包
void Eclosure(bigCell NFA,States *s)
{
for(int i=0;i<s->jset.size();i++)
{
for(int j=0;j<NFA.count;j++)
{
if(NFA.edges[j].source.id==s->jset[i] && NFA.edges[j].symbol=='?')
{
s->jset.push_back(NFA.edges[j].target.id);
}
}
}
}
//能够从状态集s出发通过字符tc转换到达的NFA状态集合,结果放在t中
void move(char tc,bigCell NFA,States* s,States* t)
{
for(int i=0;i<s->jset.size();i++)
{
for(int j=0;j<NFA.count;j++)
{
if(NFA.edges[j].source.id==s->jset[i] && NFA.edges[j].symbol==tc)
t->jset.push_back(NFA.edges[j].target.id);
}
}
}
//添加状态子集
bool add(vector<States*>allSet,States *newS)
{
bool b=true