有限状态机FSM(Finite State Machine),其在任意时刻都处于有限状态集合中的某一状态。当其获得一个输入字符时,将从当前状态转换到另一个状态,或者仍然保持在当前状态。
任何一个FSM都可以用状态转换图来描述,图中的节点表示FSM中的一个状态,有向加权边表示输入字符时状态的变化。如果图中不存在与当前状态与输入字符对应的有向边,则FSM将进入“消亡状态(Doom State)”,此后FSM将一直保持“消亡状态”。
在启动一个FSM时,首先必须将FSM置于“起始状态”,然后输入一系列字符,最终,FSM会到达“结束状态”或者“消亡状态”。
应用:
删除代码中的注释/* */部分
#include <stdio.h>
int main()
{
enum { COPY, START, COMMENT, END };
char c;
int state = COPY;
while ((c = getchar()) != EOF)
{
switch (state)
{
case COPY:
if (c == '/') state = START;
else putchar(c);
break;
case START:
if (c == '*') state = COMMENT;
else
{
putchar('/');
state = (c == '/') ? START : (putchar(c), COPY);
}
break;
case COMMENT:
if (c == '*') state = END;
break;
case END:
state = (c == '/') ? COPY : ((c == '*') ? END : COMMENT);
}
}
return 0;
}
此代码中,如果读入到/,先进入开始状态。若再读到*则进入注释状态,否则保持开始状态。注释状态下,当读入*就进入结束状态。在结束状态下,如果读到/表明注释结束,如果读到*仍停留在结束状态,如果读到其他的则返回注释状态。