自动机 java 密码_自动机编程

#include

enum states { before, inside, after };

void step(enum states *state, int c)

{

if(c == '\n') {

putchar('\n');

*state = before;

} else

switch(*state) {

case before:

if(c != ' ') {

putchar(c);

*state = inside;

}

break;

case inside:

if(c == ' ') {

*state = after;

} else {

putchar(c);

}

break;

case after:

break;

}

}

int main(void)

{

int c;

enum states state = before;

while((c = getchar()) != EOF) {

step(&state, c);

}

return 0;

}

此例清楚的呈现自动机编程程序的基本特点:

各自动机步骤程序的运行时间不互相重叠。

前一个步骤和下一个步骤之间所交换的数据只有标示为“自动机状态”的变量(此例中为变量state)。

显式的状态转换表

自动机编程可以用显式的状态转换表来表示。以下的程序中的the_table数组即为状态转换表,其列表示三个不同的状态,其每一栏对应输入的字符(从左到右分别是空白、换行字符及其他字符)。

对于每一种可能的状态及输入字符的组合,表中有其对应的新状态及一个决定是否否显示输入字符的旗标。在实务的专案中状态转换表可能更为复杂,例如可能包括所有可能条件组合下需调用的函数指针。

#include

enum states { before = 0, inside = 1, after = 2 };

struct branch {

unsigned char new_state:2;

unsigned char should_putchar:1;

};

struct branch the_table[3][3] = {

/* ' ' '\n' others */

/* before */ { {before,0}, {before,1}, {inside,1} },

/* inside */ { {after, 0}, {before,1}, {inside,1} },

/* after */ { {after, 0}, {before,1}, {after, 0} }

};

void step(enum states *state, int c)

{

int idx2 = (c == ' ') ? 0 : (c == '\n') ? 1 : 2;

struct branch *b = & the_table[*state][idx2];

*state = (enum states)(b->new_state);

if(b->should_putchar) putchar(c);

}

int main(void)

{

int c;

enum states state = before;

while((c = getchar()) != EOF)

step(&state, c);

return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值