简易有穷自动机实验

一、实验目标

1、掌握有穷状态自动机的概念;

2、掌握有穷状态自动机的存储及表示方法;

3、掌握有穷状态自动机与正则式之间的关系。

二、实验要求

1、输入正规式;

2、构造该正规式的有穷状态自动机;

3. 以五元组形式输出。

三、构造方法

如图

代码如下

#include<iostream>
#include<string>
using namespace std;
void DFA(int, int, string);
int main()
{
    string s;
    cin >> s;
    DFA(0, 1, s);
    system("pause");
    return 0;
}

void DFA(int x, int y, string s)//采用递归的方法
{
    int i = 0;
    for (i = 0; i < s.length(); i++)//多处采用for是为了保证关键字的优先级
        if (s[i] == ‘|‘)//如果s[i]==‘|’,则将字符串s分隔开,如 ‘a|b‘的话,将字符串分隔为s1=a;s2=b;并再次进行递归 ,递归结束的条件为s[i]!=’|‘
        {
            string s1(s, 0, i - 1);
            string s2(s, i + 1);
            DFA(x, y, s1); DFA(x, y, s2);
        }
    for (i = 0; i < s.length(); i++)//同上,递归结束条件为是s[i]!=’.‘
        if (s[i] == ‘.‘)
        {
            string s1(s, i - 1, 1);
            string s2(s, i + 1, 1);
            DFA(x, y + 1, s1); DFA(y + 1, y, s2);
        }
    for (i = 0; i < s.length(); i++)//同上,递归结束条件为s[i]!=’*‘
    {
        if (s[i] == ‘*‘)
        {
            string s1("~");
            string s2(s, i - 1, 1);
            DFA(x, y + 2, s1);
            DFA(y + 2, y + 2, s2);
            DFA(y + 2, y, s1);
        }
    }
    if (s.length() == 1)//确保最后不会输出整个字符串
        cout << "f(" << x << "," << s << ")=" << y << endl;
}

程序结果如图

其中关于闭包部分会出现重复输出,但不影响结果

结构图如右(0表示初态,1表示终态,3,4为新添加状态,~表示空串)

时间: 2024-11-07 16:05:42

简易有穷自动机实验的相关文章

20165223 实验二 面向对象程序设计

目录 一.实验报告封面 二.具体实验内容 (一)初步掌握JUnit的使用 (二)IDEA中的JAVA程序开发 (三)自主练习 三.实验总结 四.PSP时间 一.实验报告封面 北京电子科技学院(BESTI) 实 验 报 告 ◆ ◇ ◆ ◇ 课程 Java程序设计 班级 1652班 姓名 蔡霓 学号 20165223 成绩 指导教师 娄嘉鹏 实验日期 2018年4月16日 实验密级 非密级 预习程度 已预习 实验时间 13:45 - 15:25 必修/选修 选修 实验序号 二 实验名称:面向对象程序

2017-2018-2 20165330 实验四《Android程序设计》实验报告

下载与安装Android Studio 下载地址:Download Android Studio 安装教程参考Android开发简易教程 实验内容 任务一 参考<Java和Android开发学习指南(第二版)(EPUBIT,Java for Android 2nd)>第二十四章,完成Hello World, 要求修改res目录中的内容,Hello World后要显示自己的学号,自己学号前后一名同学的学号 实验过程 找到app下的res目录,点击layout中的activity_main.xml

LogMiner救命稻草_找回误删除数据

LogMiner日志挖掘技术在有些时候可以被比作是命悬一线的救命稻草,比方说误删除数据(如delete执行不当),可以通过LogMiner挖掘日志文件将这些数据补插回来 使用LogMiner预览: o LogMiner的原理就是找出日志文件(redo file),所对应的UNDO.如你新增1W行数据,在redo里以insert形式体现,对应的undo即为delete o LogMiner所有操作要在单个会话里执行 o LogMiner是挖掘在线日志或归档日志,因此最好要知道误操作的具体(精确更好

单片机入门指南系列(八) 用面包板搭建实验电路

本文由PurpleSword(jzj1993)原创,转载请注明.原文网址 http://blog.csdn.net/jzj1993 前面介绍了几种准备实验板的方案.这里先介绍方案一,我将同大家一起搭建一块简易的单片机实验板,一起感受动手实践的乐趣. 我们有两种自己搭建实验板的方案,一是用面包板,二是用万用焊板.本篇我们介绍面包板搭建电路. 面包板是一种用于电路实验的器材,上面有很多孔,我们可以将元器件和导线插进去,组成我们需要的电路.如果发现电路有错,拔下元件和导线重新插接即可.电路做完后,所有

So Easy! Oracle在Linux上的安装配置系列六

oracle数据库的几种连接方法 上篇内容回顾 一个监听器配置文件中有一个或多个监听的协议地址,支持服务器的信息和控制运行时行为的参数,监听器配置存储在名为listener.ora的配置文件中,因为所有的配置参数都有默认值,所以在没有配置的情况下它仍然可以被启动和使用,这个默认监听器名字是LISTENET,它监听在以下TCP/IP协议地址,(ADDRESS=(PROTOCOL=tcp)(HOST=host_name)(PORT=1521))但这个默认监听器它在启动时不支持任何的服务 监听器转发客

Zabbix安装与简单配置

目录 0. 前言 1. 安装 1.1 准备安装环境 1.1.1 下载安装包 1.1.2 修改文件配置 1.2 开始安装 2. 实验环境 2.1 简易拓扑图 2.2 基本配置 3. 配置 0. 前言 不管是在局域网.广域网还是数据中心IDC,一个健康的网络环境,都离不开一套网管系统. 网管系统不限于如下: 监控平台:用于监控网络设备.服务器.中间件等各项指标,超过阈值触发告警通知: 日志平台:用于收集所有设备日志数据.分析.可视化,报警.追溯等功能: 自动化运维平台:用于减少重复性工作,自动化执行

简易的nat实验

实验名称:一个简易的nat实验实验拓扑: 实验需要:-将内部地址10.1.1.1/24 , 10.1.1.2/24 用动态NAT的方式,转换成公网地址 61.15.62.1/28,以便可以访问外网-将内部地址10.1.1.3/24的80端口 映射到公网地址 61.15.62.2/28 的8080端口,以便被外网访问: 步骤: 1.按图中配置各个终端设备. pc1-2 以及server 网关为 10.1.1.254 client1 的网关配置为 61.15.62.142 2.配置网络设备 #配置作

实验楼mysql实验-搭建一个简易的成绩管理系统的数据库

网址如下https://www.shiyanlou.com/courses/running ,pass之后的体验还蛮好的,. 首先打开终端,双击xfce终端或右键打开终端 开启数据库服务 ,连接数据库 首先创建新的数据库create database gradesystem; 接着选择新创建的数据库 use gradesystem; 进行建表,使用create table 语句,分别建立三个表,student,course,mark 其中stdent表的sid和course表的cid分别是mar

实验7-2-10 简易连连看 (20分)

本题要求实现一个简易连连看游戏模拟程序. 给定一个2的方阵网格游戏盘面,每个格子中放置一些符号.这些符号一定是成对出现的,同一个符号可能不止一对.程序读入玩家给出的一对位置(.(,判断这两个位置上的符号是否匹配.如果匹配成功,则将两个符号消为“*”并输出消去后的盘面:否则输出“Uh-oh”.若匹配错误达到3次,则输出“Game Over”并结束游戏.或者当全部符号匹配成功,则输出“Congratulations!”,然后结束游戏. 输入格式: 输入在一行中给一个正整数N(<).随后2行,每行2个