热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

展开全部#includestdafx.h#include#include#include#includeusingnamespacestd;structTransform{fr

展开全部

#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!&#61;&#39;#&#39;)

{

state.push_back(ch);

cin>>ch;

}

cout<

cin>>ch;

while(ch!&#61;&#39;#&#39;)

{

table.push_back(ch);

cin>>ch;

}

cout<

cout<

cin>>tran;

while(tran!&#61;&#39;#&#39;)

{

fun.push_back(tran);

cin>>tran;

}

cout<

cin>>q0;

cout<

cin>>ch;

while(ch!&#61;&#39;#&#39;)

{

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&#61;string(1,q0); //从初始状态开始

ct.flag&#61;0;

changetable.push_back(ct);

int index&#61;GetIndexofChangeTable();

while(index!&#61;-1)

{

changetable[index].flag&#61;1;

str&#61;changetable[index].state; //弹出状态

for(pos&#61;table.begin();pos!&#61;table.end();&#43;&#43;pos) //每种输入状态

{

mid.erase();

for(p&#61;str.begin();p!&#61;str.end();&#43;&#43;p) //每个状态的每个字符

{

mid&#43;&#61;GetChangeState(*p,*pos);

RemoveRepeat(mid);

}

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

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

{

ct.state&#61;mid;

ct.flag&#61;0;

changetable.push_back(ct);

}

}

index&#61;GetIndexofChangeTable();

}

}

void FA::OutputChangeTable()

{

vector::iterator pos;

for(pos&#61;changetable.begin();pos!&#61;changetable.end();&#43;&#43;pos)

{ cout<

for(int i&#61;0;i

cout<

cout<

}

}

void FA::Deterministic(FA &dfa)

{

GetChangeTable();

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

dfa.table&#61;table;

int size&#61;0;

while(size

{

dfa.state.push_back(&#39;A&#39;&#43;size);

size&#43;&#43;;

}

dfa.q0&#61;&#39;A&#39;; //求初态

Transform tran;

vector::iterator pos;

vector::iterator p;

for(int i&#61;0;i

{

tran.state1&#61;&#39;A&#39;&#43;i;

for(p&#61;table.begin(),pos&#61;changetable[i].changestate.begin();pos!&#61;changetable[i].changestate.end();&#43;&#43;pos,&#43;&#43;p)

{

tran.letter&#61;*p;

int index&#61;GetIndexofChangeTable(*pos);

tran.state2&#61;&#39;A&#39;&#43;index;

if(index!&#61;-1)

dfa.fun.push_back(tran);

}

//下面来求终态集

string mid;

string str&#61;changetable[i].state;

for(p&#61;Z.begin();p!&#61;Z.end();&#43;&#43;p)

{

mid.erase();

mid&#43;&#61;*p;

}

int idx&#61;str.find(mid);

if(idx!&#61;string::npos)

dfa.Z.push_back(&#39;A&#39;&#43;i);

}

}

void FA::output()

{

vector::iterator pos;

cout<

cout<

for(pos&#61;state.begin();pos!&#61;state.end()-1;&#43;&#43;pos)

cout<

cout<

cout<

for(pos&#61;table.begin();pos!&#61;table.end()-1;&#43;&#43;pos)

cout<

cout<

cout<

for(std::vector::iterator p&#61;fun.begin();p!&#61;fun.end();&#43;&#43;p)

cout<

cout<

cout<

for(pos&#61;Z.begin();pos!&#61;Z.end()-1;&#43;&#43;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&#61;&#61;

已赞过

已踩过<

你对这个回答的评价是&#xff1f;

评论

收起



推荐阅读
  • 扫描线三巨头 hdu1928hdu 1255  hdu 1542 [POJ 1151]
    学习链接:http:blog.csdn.netlwt36articledetails48908031学习扫描线主要学习的是一种扫描的思想,后期可以求解很 ... [详细]
  • UNP 第9章:主机名与地址转换
    本章探讨了用于在主机名和数值地址之间进行转换的函数,如gethostbyname和gethostbyaddr。此外,还介绍了getservbyname和getservbyport函数,用于在服务器名和端口号之间进行转换。 ... [详细]
  • 本文详细介绍了C语言中链表的两种动态创建方法——头插法和尾插法,包括具体的实现代码和运行示例。通过这些内容,读者可以更好地理解和掌握链表的基本操作。 ... [详细]
  • 本文介绍如何使用Objective-C结合dispatch库进行并发编程,以提高素数计数任务的效率。通过对比纯C代码与引入并发机制后的代码,展示dispatch库的强大功能。 ... [详细]
  • 火星商店问题:线段树分治与持久化Trie树的应用
    本题涉及编号为1至n的火星商店,每个商店有一个永久商品价值v。操作包括每天在指定商店增加一个新商品,以及查询某段时间内某些商店中所有商品(含永久商品)与给定密码值的最大异或结果。通过线段树分治和持久化Trie树来高效解决此问题。 ... [详细]
  • 题目描述:给定n个半开区间[a, b),要求使用两个互不重叠的记录器,求最多可以记录多少个区间。解决方案采用贪心算法,通过排序和遍历实现最优解。 ... [详细]
  • Splay Tree 区间操作优化
    本文详细介绍了使用Splay Tree进行区间操作的实现方法,包括插入、删除、修改、翻转和求和等操作。通过这些操作,可以高效地处理动态序列问题,并且代码实现具有一定的挑战性,有助于编程能力的提升。 ... [详细]
  • 使用Vultr云服务器和Namesilo域名搭建个人网站
    本文详细介绍了如何通过Vultr云服务器和Namesilo域名搭建一个功能齐全的个人网站,包括购买、配置服务器以及绑定域名的具体步骤。文章还提供了详细的命令行操作指南,帮助读者顺利完成建站过程。 ... [详细]
  • 题目Link题目学习link1题目学习link2题目学习link3%%%受益匪浅!-----&# ... [详细]
  • 本实验主要探讨了二叉排序树(BST)的基本操作,包括创建、查找和删除节点。通过具体实例和代码实现,详细介绍了如何使用递归和非递归方法进行关键字查找,并展示了删除特定节点后的树结构变化。 ... [详细]
  • 本文详细探讨了VxWorks操作系统中双向链表和环形缓冲区的实现原理及使用方法,通过具体示例代码加深理解。 ... [详细]
  • 本题涉及一棵由N个节点组成的树(共有N-1条边),初始时所有节点均为白色。题目要求处理两种操作:一是改变某个节点的颜色(从白变黑或从黑变白);二是查询从根节点到指定节点路径上的第一个黑色节点,若无则输出-1。 ... [详细]
  • 本文探讨了如何通过最小生成树(MST)来计算严格次小生成树。在处理过程中,需特别注意所有边权重相等的情况,以避免错误。我们首先构建最小生成树,然后枚举每条非树边,检查其是否能形成更优的次小生成树。 ... [详细]
  • 从 .NET 转 Java 的自学之路:IO 流基础篇
    本文详细介绍了 Java 中的 IO 流,包括字节流和字符流的基本概念及其操作方式。探讨了如何处理不同类型的文件数据,并结合编码机制确保字符数据的正确读写。同时,文中还涵盖了装饰设计模式的应用,以及多种常见的 IO 操作实例。 ... [详细]
  • 本文深入探讨了C++对象模型中的一些细节问题,特别是虚拟继承和析构函数的处理。通过具体代码示例和详细分析,揭示了书中某些观点的不足之处,并提供了更合理的解释。 ... [详细]
author-avatar
xiaodubo1R
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有