FSM有限状态机运用分析系列一 —— 文本处理一
摘要:有穷状态机的形式定义有穷状态机是一个五元组 (Q,Σ,δ,q0,F),其中:Q是一个有穷集合,称为状态集。Σ是一个有穷集合,称为字母表。δ: Q xΣQ称为状态转移函数。q0 是初始状态。F 是接受状态集。教科书上是这样定义有穷自动机的,这个形式定义精确的描述了有穷状态机的含义。但是大部分人(包括我自己)第一次看到它时,反复的读上几遍,仍然不知道它在说什么。幸好通过一些实例,我们可以很容易明白有穷状态机的原理。自动门是一个典型的有穷状态机:它有“开”和“关”两种状态,这就是它的状态集,也就是上面所说的Q。人可以从自动门进来或出去,当人进来或出去的时候,自动门会自动打开,如果在规定的时间内没有
阅读全文
posted @
2012-09-17 13:34
竞击
阅读(774)
推荐(1)
FSM有限状态机运用分析系列一 —— 文本处理二
摘要:用有穷状态机解一道面试题。刚毕业的时候,我到一家外企面试,面试题里有这样一道题:统计一篇英文文章里的单词个数。有多种方法可以解这道题,这里我们选择用有穷状态机来解,做法如下:先把这篇英文文章读入到一个缓冲区里,让一个指针从缓冲区的头部一直移到缓冲区的尾部,指针会处于两种状态:“单词内”或“单词外”,加上后面提到的初始状态和接受状态,就是有穷状态机的状态集。缓冲区中的字符集合就是有穷状态机的字母表。如果当前状态为“单词内”,移到指针时,指针指向的字符是非单词字符(如标点和空格),那状态会从“单词内”转换到“单词外”。如果当前状态为“单词外”, 移到指针时,指针指向的字符是单词字符(如字母),那状
阅读全文
posted @
2012-09-17 13:31
竞击
阅读(815)
推荐(0)
FSM有限状态机运用分析系列一 —— INI解析器
摘要:上面我们看了只有中间两个状态的状态机,现在我们来看一个稍微复杂一点的状态机。INI文件是Windows下常用的一种配置文件。它由多个分组组成,每个组有多个配置项,每个配置项又由名称和值组成。文件里还可以包含注释,注释通常以‘;’(或‘#’)开始,直到当前行结束。如XP下的win.ini: 1 ; for 16-bit app support 2 [fonts] 3 [extensions] 4 [mci extensions] 5 [files] 6 [MCI Extensions.BAK] 7 aif=MPEGVideo 8 aifc=MPEGVideo 9 aiff=MPEGVideo10
阅读全文
posted @
2012-09-17 12:55
竞击
阅读(548)
推荐(0)
FSM有限状态机运用分析系列一 —— XML解析器
摘要:XML(Extensible Markup Language)即可扩展标记语言,也是一种常用的数据文件格式。相对于INI来说,它要复杂得多,INI只能保存线性结构的数据,而XML可以保存树形结构的数据。先看下面的例子:1 <?xml version="1.0" encoding="utf-8"?>2 <mime-type xmlns="http://www.freedesktop.org/standards/shared-mime-info" type="all/all">3 <!--
阅读全文
posted @
2012-09-17 12:47
竞击
阅读(835)
推荐(0)
指针拷贝与值的传递
摘要:C永远有着那么多你所不知道的东西,最近在Coding的时候,发现对于指针,我还是没有琢磨好。碰到这么一个问题,看代码如下:View Code 1 int a; 2 3 address(int *m) 4 { 5 m = &a; 6 } 7 8 main() 9 {10 int *p;11 12 address(p);13 }这里只是为说明问题,将代码简化了,上面的代码有很大的问题,在main函数中,将指针做为实参传递给形参,这样可以吗?很显然,这是不可以的,这样传递的只是实参的一个拷贝而已,真正的实参并没有传递过去,所以,address调用完毕以后...
阅读全文
posted @
2012-09-17 12:07
竞击
阅读(314)
推荐(0)
关于结构体内存的分配与赋值
摘要:最近项目中使用了很多结构体,其中有如下关于结构体的赋值问题:设结构体A,B且,A与B均为同类型的结构体.现假设要想将B的值给A,至于是否可以像A=B这样去赋值,就像普通的变量一样使用查了很多资料,包括谭浩强的教材,几乎都是清一色的说不能这样去赋值,赋值不成功。但是这两天,在具体的编译器上这样去用的时候,却是可以的,和用memcpy一样的效果。刚开始怀疑书上是否有错,后来查了许多资料,原来,只是C语言的版本不同而已,因此,哪怕同一类编译器只要,可能版本的不一样,也可能导致有的程序能编译,有的不能编译。下面,是从维基上摘录的信息,一般新的编译器应该支持最新版本的编译器,所以在用编译器的时候要注意一
阅读全文
posted @
2012-09-17 12:05
竞击
阅读(643)
推荐(0)