dfa2.java 原理_DFA编程练习2
题目: 请设计DFA, 使其接受全部含有奇数个1的串, 假定 ∑ = {0, 1}.
解:
DFA可能出现两个个状态:
qeven: 读入了偶数个1的串.
qodd: 读入了奇数个1的串, 该状态也是终结状态(accept state).
它们的状态转移图如下:
编写程序, 运行效果如下:
测试用例说明:
0000不被上图的DFA接受
1111不被上图的DFA接受
1符合题目要求, 被DFA接受
0011001符合题目要求, 被DFA接受
空串不被DFA接受
0不被上图DFA接受
程序代码如下:
/* FSM-example2.c
* Using Deterministic Finite Automaton to recongnize
* a `0-1 string`
*
* Example2: Please design a DFA, accept every string
* containing odd numers of 1.
**/
#include
#include // calloc()
#include
enum {
STATE_even = 1, // Even number of 1 has readed
STATE_odd, // Odd number of 1 has readed
STATE_T // Accept state
};
typedef struct fsm_st {
int state;
int pos; // point to current pos
char buf[BUFSIZ];
}fsm_st;
fsm_st* myFsm;
void FSMdriver(fsm_st*);
void Hault(int);
int main() {
/* Create a FSM and initialize */
myFsm = (fsm_st*)calloc(0x1, sizeof(myFsm));
myFsm->state = STATE_even;
myFsm->pos = 0;
/* Read a string */
printf("Input a 01-string: ");
fgets(myFsm->buf, BUFSIZ, stdin);
/* Strat FSM */
while( myFsm->state != STATE_T ) {
FSMdriver(myFsm);
}
printf("Accept string!
");
free(myFsm);
return 0;
}
void FSMdriver(fsm_st* me) {
int pos = me->pos;
switch(me->state) {
case STATE_even:
if( me->buf[pos] == ‘1‘ ) {
me->state = STATE_odd;
me->pos++;
} else if( me->buf[pos] == ‘0‘ ) {
me->state = STATE_even;
me->pos++;
} else {
Hault(STATE_even);
}
break;
case STATE_odd:
if( me->buf[pos] == ‘0‘ ) {
me->state = STATE_T; // Terminated correctly
me->pos++;
} else if( me->buf[pos] == ‘1‘ ) {
me->state = STATE_even;
me->pos++;
} else {
me->state = STATE_T; // At the end stay in STATE_odd
}
break;
}
}
void Hault(int s) {
printf("FSM hault in STATE_%d
", s);
printf("FSM don‘t accept this string
");
free(myFsm);
exit(0);
}
DFA编程练习2
dfa2.java 原理_DFA编程练习2相关推荐
- Java Review - 并发编程_ 回环屏障CyclicBarrier原理源码剖析
文章目录 Pre 小Demo 类图结构 CyclicBarrier核心方法源码解读 int await() int await(long timeout, TimeUnit unit) int dow ...
- Java Review - 并发编程_ScheduledThreadPoolExecutor原理源码剖析
文章目录 概述 类结构 核心方法&源码解析 schedule(Runnable command, long delay,TimeUnit unit) scheduleWithFixedDela ...
- Java Review - 并发编程_ArrayBlockingQueue原理源码剖析
文章目录 概述 类图结构 构造函数 主要方法源码解析 offer操作 put操作 poll操作 take操作 peek操作 size 小结 概述 Java Review - 并发编程_LinkedBl ...
- Java Review - 并发编程_LinkedBlockingQueue原理源码剖析
文章目录 概述 类图结构 主要方法 offer操作 概述 Java Review - 并发编程_ConcurrentLinkedQueue原理&源码剖析 介绍了使用CAS算法实现的非阻塞队列C ...
- Java Review - 并发编程_读写锁ReentrantReadWriteLock的原理源码剖析
文章目录 ReentrantLock VS ReentrantReadWriteLock 类图结构 非公平的读写锁实现 写锁的获取与释放 void lock() void lockInterrupti ...
- Java Review - 并发编程_原子操作类LongAdder LongAccumulator剖析
文章目录 概述 小Demo 源码分析 重要的方法 long sum() reset sumThenReset longValue() add(long x) longAccumulate(long x ...
- trident原理及编程指南
trident原理及编程指南 @(STORM)[storm, 大数据] trident原理及编程指南 一理论介绍 一trident是什么 二trident处理单位 三事务类型 1spout类型 2st ...
- JAVA的网络编程【转】
转自 http://www.cnblogs.com/springcsc/archive/2009/12/03/1616413.html 网络编程 网络编程对于很多的初学者来说,都是很向往的一种编程技能 ...
- 操作系统锁的实现方法有哪几种_「从入门到放弃-Java」并发编程-锁-synchronized...
简介 上篇[从入门到放弃-Java]并发编程-线程安全中,我们了解到,可以通过加锁机制来保护共享对象,来实现线程安全. synchronized是java提供的一种内置的锁机制.通过synchroni ...
最新文章
- PCL-1.8.1从源码搭建开发环境二(FLANN库的编译)
- ajax请求挂起_Ajax请求内部循环挂起浏览器?
- docker 安装mysql_docker学习4docker安装mysql环境
- Ubuntu下装QQ2014(http://my.oschina.net/oscfox/blog/315951)
- python字典顺序遍历_在Python中,如何按已排序的键顺序遍历字典?
- 安卓USB开发教程 六 安卓 AOA 2.0
- python面向对象怎么解决_Python面向对象编程1
- JEECG开源团队招募成员计划
- 在子线程中更改主线程中的控件的信息,在子线程中用toast
- unity的inputField文本框赋值问题
- ff7重制版青魔法_最终幻想7重制版蒂法全服装获取攻略
- PHP 乐心 发送验证码 验证码识别
- 【在线电子书转换】云展网教程 | 如何设置电子书的翻页速度?
- 海洋环境保护具体内容
- 数据智能让天下没有难做的营销——友盟+首席运营官吕志国 确认出席第七届GDMS!...
- 美团--测试创建团购订单
- 算法题中常用的JS数据处理方式
- 屏幕横竖发生变化时,当前Activity发生的生命周期变化
- 第二章 大教堂与市集
- 基于荔枝派Lichee Nano(全志f1c100s)的kernel移植(二)