题目: 请设计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相关推荐

  1. Java Review - 并发编程_ 回环屏障CyclicBarrier原理源码剖析

    文章目录 Pre 小Demo 类图结构 CyclicBarrier核心方法源码解读 int await() int await(long timeout, TimeUnit unit) int dow ...

  2. Java Review - 并发编程_ScheduledThreadPoolExecutor原理源码剖析

    文章目录 概述 类结构 核心方法&源码解析 schedule(Runnable command, long delay,TimeUnit unit) scheduleWithFixedDela ...

  3. Java Review - 并发编程_ArrayBlockingQueue原理源码剖析

    文章目录 概述 类图结构 构造函数 主要方法源码解析 offer操作 put操作 poll操作 take操作 peek操作 size 小结 概述 Java Review - 并发编程_LinkedBl ...

  4. Java Review - 并发编程_LinkedBlockingQueue原理源码剖析

    文章目录 概述 类图结构 主要方法 offer操作 概述 Java Review - 并发编程_ConcurrentLinkedQueue原理&源码剖析 介绍了使用CAS算法实现的非阻塞队列C ...

  5. Java Review - 并发编程_读写锁ReentrantReadWriteLock的原理源码剖析

    文章目录 ReentrantLock VS ReentrantReadWriteLock 类图结构 非公平的读写锁实现 写锁的获取与释放 void lock() void lockInterrupti ...

  6. Java Review - 并发编程_原子操作类LongAdder LongAccumulator剖析

    文章目录 概述 小Demo 源码分析 重要的方法 long sum() reset sumThenReset longValue() add(long x) longAccumulate(long x ...

  7. trident原理及编程指南

    trident原理及编程指南 @(STORM)[storm, 大数据] trident原理及编程指南 一理论介绍 一trident是什么 二trident处理单位 三事务类型 1spout类型 2st ...

  8. JAVA的网络编程【转】

    转自 http://www.cnblogs.com/springcsc/archive/2009/12/03/1616413.html 网络编程 网络编程对于很多的初学者来说,都是很向往的一种编程技能 ...

  9. 操作系统锁的实现方法有哪几种_「从入门到放弃-Java」并发编程-锁-synchronized...

    简介 上篇[从入门到放弃-Java]并发编程-线程安全中,我们了解到,可以通过加锁机制来保护共享对象,来实现线程安全. synchronized是java提供的一种内置的锁机制.通过synchroni ...

最新文章

  1. PCL-1.8.1从源码搭建开发环境二(FLANN库的编译)
  2. ajax请求挂起_Ajax请求内部循环挂起浏览器?
  3. docker 安装mysql_docker学习4docker安装mysql环境
  4. Ubuntu下装QQ2014(http://my.oschina.net/oscfox/blog/315951)
  5. python字典顺序遍历_在Python中,如何按已排序的键顺序遍历字典?
  6. 安卓USB开发教程 六 安卓 AOA 2.0
  7. python面向对象怎么解决_Python面向对象编程1
  8. JEECG开源团队招募成员计划
  9. 在子线程中更改主线程中的控件的信息,在子线程中用toast
  10. unity的inputField文本框赋值问题
  11. ff7重制版青魔法_最终幻想7重制版蒂法全服装获取攻略
  12. PHP 乐心 发送验证码 验证码识别
  13. 【在线电子书转换】云展网教程 | 如何设置电子书的翻页速度?
  14. 海洋环境保护具体内容
  15. 数据智能让天下没有难做的营销——友盟+首席运营官吕志国 确认出席第七届GDMS!...
  16. 美团--测试创建团购订单
  17. 算法题中常用的JS数据处理方式
  18. 屏幕横竖发生变化时,当前Activity发生的生命周期变化
  19. 第二章 大教堂与市集
  20. 基于荔枝派Lichee Nano(全志f1c100s)的kernel移植(二)

热门文章

  1. 谁在窥屏_TheShy直播被窥屏搞怕了,为了防止被窥屏,这个做法绝了
  2. c# 标准正太分布函数_数据标准化处理中的min-max和zscore
  3. java ReentrantLock 使用
  4. MapReduce计数器
  5. jeecg流程梳理学习
  6. 数学_同取对数(HDU_1060)
  7. java算法:冒泡排序
  8. 《当程序员的那些狗日日子》(三十六)无名的配角
  9. JS的手写TRIM函数
  10. 住宅的结构有哪些形式