JAVA实现nfa到dfa的转换_用c++实现,NFA到DFA的转换,请教高手。讲一下思想。

展开全部

#include "stdafx.h"

#include

#include

#include

#include

using namespace std;

struct Transform

{

friend class FA;

char state1;

char letter;

char state2;

bool operator!=(char ch);

friend istream& operator>>(istream& in,Transform& t);

};

struct ChangeTable

{

string state;

int flag;

vector changestate;

};

bool Transform::operator!=(char ch)

{

return state1!=ch||letter!=ch||state2!=ch;

}

namespace std

{

istream& operator>>(istream& in,Transform& t)

{

return in>>t.state1>>t.letter>>t.state2;

}

}

class FA

{

private:

vector state; //状态集

vector table; //输入字母表

vector fun; //状态变迁函数

char q0; //初态

vector Z; //终态集

string GetChangeState(char state1,char table);

void RemoveRepeat(string &str); //消除重复元素

private:

vector changetable;

bool IsInChangeTable(string str);

int GetIndexofChangeTable(); //找出第一个flag为0的索引e5a48de588b662616964757a686964616f31333238653266

int GetIndexofChangeTable(string str); //找出str 在表中的索引

void GetChangeTable();

void OutputChangeTable();

public:

// FA(){}

void Deterministic(FA &dfa);

void input();

void output();

};

void FA::RemoveRepeat(string &str)

{

string mid;

string::size_type idx;

string::iterator pos;

for(pos=str.begin();pos!=str.end();++pos)

{

idx=mid.find(*pos);

if(idx==string::npos)

mid+=*pos;

}

str=mid;

}

bool FA::IsInChangeTable(string str)

{

vector::iterator pos;

for(pos=changetable.begin();pos!=changetable.end();++pos)

if((*pos).state==str)

return 1;

return 0;

}

int FA::GetIndexofChangeTable()

{

int index;

for(index=0;index

if(changetable[index].flag==0)

return index;

return -1;

}

int FA::GetIndexofChangeTable(string str)

{

int index;

for(index=0;index

if(changetable[index].state==str)

return index;

return -1;

}

string FA::GetChangeState(char state1,char table)

{

string str;

vector::iterator pos;

for(pos=fun.begin();pos!=fun.end();++pos)

if((*pos).state1==state1&&(*pos).letter==table)

str+=(*pos).state2;

RemoveRepeat(str);

return str;

}

void FA::input()

{

char ch;

Transform tran;

cout<

cin>>ch;

while(ch!='#')

{

state.push_back(ch);

cin>>ch;

}

cout<

cin>>ch;

while(ch!='#')

{

table.push_back(ch);

cin>>ch;

}

cout<

cout<

cin>>tran;

while(tran!='#')

{

fun.push_back(tran);

cin>>tran;

}

cout<

cin>>q0;

cout<

cin>>ch;

while(ch!='#')

{

Z.push_back(ch);

cin>>ch;

}

}

void FA::GetChangeTable()

{

ChangeTable ct,midct;

string str;

string mid;

queue q;

vector::iterator pos;

string::iterator p;

ct.state=string(1,q0); //从初始状态开始

ct.flag=0;

changetable.push_back(ct);

int index=GetIndexofChangeTable();

while(index!=-1)

{

changetable[index].flag=1;

str=changetable[index].state; //弹出状态

for(pos=table.begin();pos!=table.end();++pos) //每种输入状态

{

mid.erase();

for(p=str.begin();p!=str.end();++p) //每个状态的每个字符

{

mid+=GetChangeState(*p,*pos);

RemoveRepeat(mid);

}

changetable[index].changestate.push_back(mid);

if(!mid.empty()&&!IsInChangeTable(mid))

{

ct.state=mid;

ct.flag=0;

changetable.push_back(ct);

}

}

index=GetIndexofChangeTable();

}

}

void FA::OutputChangeTable()

{

vector::iterator pos;

for(pos=changetable.begin();pos!=changetable.end();++pos)

{ cout<

for(int i=0;i

cout<

cout<

}

}

void FA::Deterministic(FA &dfa)

{

GetChangeTable();

//OutputChangeTable(); //输出中间状态转换表

dfa.table=table;

int size=0;

while(size

{

dfa.state.push_back('A'+size);

size++;

}

dfa.q0='A'; //求初态

Transform tran;

vector::iterator pos;

vector::iterator p;

for(int i=0;i

{

tran.state1='A'+i;

for(p=table.begin(),pos=changetable[i].changestate.begin();pos!=changetable[i].changestate.end();++pos,++p)

{

tran.letter=*p;

int index=GetIndexofChangeTable(*pos);

tran.state2='A'+index;

if(index!=-1)

dfa.fun.push_back(tran);

}

//下面来求终态集

string mid;

string str=changetable[i].state;

for(p=Z.begin();p!=Z.end();++p)

{

mid.erase();

mid+=*p;

}

int idx=str.find(mid);

if(idx!=string::npos)

dfa.Z.push_back('A'+i);

}

}

void FA::output()

{

vector::iterator pos;

cout<

cout<

for(pos=state.begin();pos!=state.end()-1;++pos)

cout<

cout<

cout<

for(pos=table.begin();pos!=table.end()-1;++pos)

cout<

cout<

cout<

for(std::vector::iterator p=fun.begin();p!=fun.end();++p)

cout<

cout<

cout<

for(pos=Z.begin();pos!=Z.end()-1;++pos)

cout<

cout<

}

int main(int argc, char* argv[])

{

FA nfa,dfa;

nfa.input();

nfa.output();

nfa.Deterministic(dfa);

cout<

dfa.output();

return 0;

}

来源:http://topic.csdn.net/t/20041024/23/3486893.html

本回答由网友推荐

2Q==

已赞过

已踩过<

你对这个回答的评价是?

评论

收起

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现NFADFA的一种常见方法是使用子集构造法。该方法基本思路是将NFA的状态集合按照某种方式映射到DFA的状态集合,然后对于NFA中的每个状态和输入字符,计算出在DFA中对应的状态和转移字符,最终得到一个DFA。 以下是Java代码实现NFADFA的基本思路: ```java import java.util.*; public class NFAToDFA { public static void main(String[] args) { // NFA的状态转移 Map<Integer, Map<Character, Set<Integer>>> nfaTransTable = new HashMap<>(); // DFA的状态转移 Map<Set<Integer>, Map<Character, Set<Integer>>> dfaTransTable = new HashMap<>(); // NFA的终止状态集合 Set<Integer> nfaFinalStates = new HashSet<>(); // DFA的终止状态集合 Set<Set<Integer>> dfaFinalStates = new HashSet<>(); // NFA的初始状态 int nfaStartState = 0; // DFA的初始状态 Set<Integer> dfaStartState = epsilonClosure(nfaStartState, nfaTransTable); // 计算NFA的终止状态集合 // ... // 计算DFA的状态转移和终止状态集合 Queue<Set<Integer>> queue = new LinkedList<>(); queue.add(dfaStartState); while (!queue.isEmpty()) { Set<Integer> stateSet = queue.poll(); for (char c : getAllChars(nfaTransTable)) { Set<Integer> nextStateSet = new HashSet<>(); for (int state : stateSet) { Map<Character, Set<Integer>> transMap = nfaTransTable.get(state); if (transMap != null) { Set<Integer> nextStateSetForChar = transMap.get(c); if (nextStateSetForChar != null) { nextStateSet.addAll(nextStateSetForChar); } } } if (!nextStateSet.isEmpty()) { Set<Integer> dfaStateSet = epsilonClosure(nextStateSet, nfaTransTable); Map<Character, Set<Integer>> dfaTransMap = dfaTransTable.computeIfAbsent(stateSet, k -> new HashMap<>()); dfaTransMap.put(c, dfaStateSet); if (!dfaTransTable.containsKey(dfaStateSet)) { queue.add(dfaStateSet); if (!Collections.disjoint(dfaStateSet, nfaFinalStates)) { dfaFinalStates.add(dfaStateSet); } } } } } // 输出DFA的状态转移和终止状态集合 // ... } // 计算某个状态的ε闭包 private static Set<Integer> epsilonClosure(int state, Map<Integer, Map<Character, Set<Integer>>> transTable) { Set<Integer> closure = new HashSet<>(); Stack<Integer> stack = new Stack<>(); stack.push(state); while (!stack.isEmpty()) { int currentState = stack.pop(); closure.add(currentState); Map<Character, Set<Integer>> transMap = transTable.get(currentState); if (transMap != null) { Set<Integer> nextStateSetForEpsilon = transMap.get('\0'); if (nextStateSetForEpsilon != null) { for (int nextState : nextStateSetForEpsilon) { if (!closure.contains(nextState)) { stack.push(nextState); } } } } } return closure; } // 计算某个状态集合的ε闭包 private static Set<Integer> epsilonClosure(Set<Integer> stateSet, Map<Integer, Map<Character, Set<Integer>>> transTable) { Set<Integer> closure = new HashSet<>(); for (int state : stateSet) { closure.addAll(epsilonClosure(state, transTable)); } return closure; } // 获取NFA中所有可能的输入字符 private static Set<Character> getAllChars(Map<Integer, Map<Character, Set<Integer>>> transTable) { Set<Character> charSet = new HashSet<>(); for (Map<Character, Set<Integer>> transMap : transTable.values()) { charSet.addAll(transMap.keySet()); } return charSet; } } ``` 需要注意的是,该代码需要根据实际情况进行修改,比如需要根据具体的输入字符集合调整`getAllChars`方法。此外,该代码中使用了Java 8的Lambda达式,如果您使用的是较早版本的Java,需要将其中的Lambda达式改为匿名内部类或单独定义接口的实现类。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值