C语言状态机

状态机,使用C编程

什么是状态机

有限状态机(英语:finite-state machine,缩写:FSM)又称有限状态自动机(英语:finite-state automaton,缩写:FSA),简称状态机,是表示有限个状态以及在这些状态之间的转移和动作等行为的数学计算模型。

上面是wikipedia上面的解释。

状态机的数学定义:

状态机的数学定义
接受状态又称之为最终状态,状态图中通常将其标示为双圆圈。

字母表:使得状态机状态变化的行为,就是状态图中的箭头


使用一个自动门来解释上面的数学定义:
一个自动门有两种状态——打开、关闭。这就是他的状态集(Q)

当一个人进来、出去、在一定时间内没有没有人进出就会自动关上(超时)。这就是他的字母表可以认为所谓的字母表就是可以改变状态的事件

自动门从关闭到打开,就是他的状态转移函数

门在刚刚安装好的时候,我们认为其初始状态时关闭的。这就是他的初始状态

只要自动门没有坏,其就会一直运行,所以其没有接受状态接受状态集空集
自动门的状态机

状态机的分类

给定一个状态,和一个输入,你总能确定地转换到下一个状态。这就是确定有限状态机(DFA)

反之,如果无法正确的转换到下一个状态就是非确定有线状态机(NFA)

状态机的工作原理

状态机的工作原理

状态机的应用

使用状态机来计算文件中的单词的数量。

状态集:

  1. 指向字符(单词内)
  2. 指向非字符(单词外)

字母表:
每个字符就是该模型下的字母表

状态转换函数:
从单词内转换到单词外函数

初始状态:

  1. 指向的是一个字符
  2. 指向的不是一个字符

接受状态:(接受状态又称之为结束状态)
指向文本的末尾

使用图形表达:

状态机

代码完成

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
int count_word (const char* txt)
{
enum STAT{
stat_init,
stat_word_in,//位于单词
stat_word_out,//不位于单词
}stat;

int count = 0;//单词个数

const char* p = txt;

for(p;*p != '0';p++){
switch(stat){
case stat_init:
if(IS_WORD_CHAR()){//如果文本的开头是一个字符的话
stat = stat_word_in;
}
else{
stat = stat_word_out;
}
break;
case stat_word_in:
if(!IS_WORD_CHAR()){//如果不是一个字符了,那么count++
stat = stat_word_out;
count++;
}
break;
case stat_word_out:
if(IS_WORD_CHAR()){//如果是一个字符,改变状态
stat = stat_word_in;
}
break;
default:
break;
}
if(stat == stat_word_in){
count++;
}
return count;
}

扩展阅读

https://juejin.cn/post/6844903827540279309

https://cloud.tencent.com/developer/article/1046244

https://zhuanlan.zhihu.com/p/572636669

这个可以

https://www.bilibili.com/video/BV1oN411Y7FK/?spm_id_from=333.337.search-card.all.click&vd_source=c45053ab3367ce0770ffe8e9b3dced95

一个游戏开发者网站,但是讲到了状态机

一个关于正则表达式与状态机网站

参考资料

《系统程序员成长计划》第10章


C语言状态机
https://ysc2.github.io/ysc2.github.io/2023/11/12/C语言状态机/
作者
Ysc
发布于
2023年11月12日
许可协议