简单记录一下,自动机课上的一个实验,用C语言实现NFA到DFA的转化,使用的是子集构造法。
子集构造法相信大家都会,直接甩代码。
先是把NFA和DAF的转移表存储在数据结构里,这里用了二维字符数组,先是定义了一个struct onechar,用来当作转移表的一格,这让我这个程序简单了不少,但是局限性是真的多。所以程序的状态只能使用当个字符表示,且设置的最大状态集数量是20。

typedef struct onechar
{char block[MAX_NUM];//用于存储一个20个字符的字符数组
}onechar;

后面的函数调用其实有点混乱,功能分配很奇怪。
子集构造法被我写成了字符匹配算法,以下是主要函数。解释我直接写在注释里好了。

void switch_NFAtoDFA(onechar** NFA_chart, onechar** DFA_chart, char* NFA_status, onechar* DFA_status)
{int i = 0, j = 0, n = 0, flag = 1;//NFA与DFA转移表的第一行是相同的,num是DFA的状态集数量DFA_status[0].block[0] = NFA_status[0];DFA_status[0].block[1] = '\0';while (n != num){switch1(NFA_chart, DFA_chart, NFA_status, DFA_status[n].block, n);/*这个函数把DFA的新得到的状态去匹配NFA的转移表,从而得到DFA的一行*///以下的几个for循环是把新得到的一行中的状态与DFA的状态集对比,看是否有新状态for (i = 0; i < chars_num; i++){for (j = 0; j < num; j++)//n,表示已经求完第n个状态的转移函数{if (strcmp(DFA_chart[n][i].block, DFA_status[j].block) == 0)//不匹配说明是新状态(所有不匹配才可以){flag = 0;//已存在的状态}}if (flag == 1 && DFA_chart[n][i].block[0] != '#')//新状态当然要放在DFA状态集里了{strcpy(DFA_status[num].block, DFA_chart[n][i].block);num++;}flag = 1;}n++;}
}

这里是我最后发现的bug,程序会把状态一样但是字符顺序不一样的状态写成两个状态,如pqr和prq,后来发现只要排下序就好了。

for (i = 0; i < j - 1; i++)//冒泡排序,防止出现pqr,rpq是不同状态{for (k = 0; k < j - 1; k++){if (s[k] > s[k + 1]){char tmp = s[k];s[k] = s[k + 1];s[k + 1] = tmp;}}}

就简单写到这里把,本人很懒,但是直接甩代码实在不太好,就稍微写几个字,刚开始写博客记录,思维有些混乱很抱歉。附上完整代码,大家一起互相学习。
附上测试用例:

NFA转DFA完整代码在gitee上

附github

实现NFA到DFA的转化(C语言)相关推荐

  1. NTU 课程辅助笔记: NFA到DFA的转化

    我们以这张图为例: 用 Finite State Machine Designer - by Evan Wallace (madebyevan.com) 画的,有几条边的mark没画好错位了 1 写出 ...

  2. 词法分析(4)---NFA与DFA的转化

    1. 子集构造(Subset Construction) 这是一个转换NFA到DFA的算法.我们知道NFA和DFA的区别最主要的就是一个状态和一个input symbol是否能够确定一个状态的问题,对 ...

  3. NFA到DFA的转化

    1. 根据上面的状态转换图写出状态转换表,什么!不知道什么是状态转换表?那你来对地方了.状态转换表是转台转换图的另外一种表示形式,如下图,左侧表头0~9表示的 是状态,上方表头a,b,c表示的是条件. ...

  4. 编译原理知识点总结——从NFA到DFA的转化

    都是由若干个a加若干个b加若干个c,若干个最少为1. 例2,带空边的

  5. 词法分析(NFA与DFA)

    词法分析(1)---词法分析的有关概念以及转换图 词法分析是编译的第一个阶段,前面简介中也谈到过词法分析器的任务就是: 字符流------>词法记号流 这里词法分析和语法分析会交错进行,也就是说 ...

  6. 利用子集构造法实现NFA到DFA的转换

    概述 NFA非有穷自动机,即当前状态识别某个转换条件后到达的后继状态不唯一,这种自动机不便机械实现,而DFA是确定有限状态的自动机,它的状态转换的条件是确定的,且状态数目往往少于NFA,所以DFA能够 ...

  7. NFA转DFA程序设计

    实验二:利用子集构造法实现NFA到DFA的转换 [问题描述]利用子集构造法实现NFA到DFA的转换.NFA的确定化 [输入形式]NFA 参见样例.其中,第一列表示状态名,终状态用f表示:第二列和第三列 ...

  8. 编译原理——实现NFA到DFA 的转换(子集构造法)

    一.实验内容 利用⼦集构造法的实现任意NFA到DFA 的转换. 二.编程思路: 建立一个NFA类,包括初始状态,输入,下一状态: 建立一个DFA类,包括初始状态,输入,下一状态: 建立init()函数 ...

  9. NFA到DFA的转换及DFA的简化

    还不太了解有穷自动机或是NFA的同学可以先看我的上一篇文章:正则到NFA的转换 tips:评论区之前提到状态1得到6是由于之前的图有瑕疵,现在图已更正 确定型有穷自动机 确定型有穷自动机是不确定有穷自 ...

最新文章

  1. 图灵三周年盛大庆典!
  2. 第二阶段 铁大Facebook——十天冲刺(六)
  3. ORA-19573: cannot obtain exclusive enqueue for datafile 1
  4. Java中的新生代、老年代和永久代
  5. python程序设计实验配置_20181235 实验三《Python程序设计》实验报告
  6. 网红店主质疑拼多多销售假冒货品 官方:均为正品 再遭恶意污蔑
  7. OpenCV-python学习笔记(五)——shreshoding阈值化
  8. 获取公网ip,获取用户城市地址
  9. Java基础教程之Java的变量
  10. WinForm自适应的相关代码
  11. 企业常用的站内收索、QQ群、在线客服
  12. Shopee运营中如何规避账号安全风险?站斧超级浏览器防关联运营
  13. STM32CubeMx + HighSpeed USB + FreeRTOS
  14. 中国家电市场深度调查研究报告
  15. 电脑系统能ping通但不能上网怎么办
  16. vue项目使用vue-amap调用高德地图api详细步骤
  17. ArcGIS栅格数据四参数七参数投影变换
  18. 转一个PS图像处理技巧大全,很实用!
  19. PHP:抓取网页指定内容
  20. Android-茫茫9个月求职路,终于拿满意offer,项目实践

热门文章

  1. 祝大家六一儿童节快乐!
  2. 用Asprise的OCR包,处理验证码。
  3. ping和tracert命令详解
  4. 四:轻松学设计模式:创建型、结构型、行为型概览
  5. 动态给图片加相框的DEMO
  6. tinyxml 读取文本节点_c++中用TINYXML解析XML文件
  7. 搭载锤子系统的新机要来了:这是真相!
  8. hrbust 哈理工oj 2016 势力较量 (并查集)
  9. 陀螺专栏势力榜(2019年04月)
  10. 一个睡5分钟等于6个钟头的方法!!!