标签:char return 状态 词法 模拟程序 DFA 输入 define
利用有穷确定自动机M=(
K有穷状态集,
Σ输入字母表,
f转换函数,从状态s出发,沿着标记为a的边所能到达的状态
S,开始状态,S属于K
Z,接收状态,Z是K的子集
)行为模拟程序算法,来对于任意给定的串,若属于该语言时,该过程经有限次计算后就会停止并回答“是”,若不属于,要么能停止并回答“不是”
K当前状态:=S开始状态;
C当前的输入符号:=getchar返回输入串的下一个符号;
while c<>eof do
{K当前状态:=f(K,c)从状态K出发,沿着标记为c的边所能到达的状态;
c当前的输入符号:=getchar返回输入串的下一个符号; };
if K is in Z接收状态 then return (‘yes’)
else return (‘no’)
#include<stdio.h>
// 转换表大小
#define M 255
#define N 255
// 状态集个数
#define KNUM 4
// 字母表个数
#define LNUM 2
//接受集个数
#define ZNUM 1
// 状态集
char K[KNUM] = {'S', 'U', 'V', 'Q'};
// 字符集
char C[LNUM] = {'a', 'b'};
// 开始状态
char S = 'S';
// 接收状态
char Z[1] = {'Q'};
// 状态转换表
char table[M][N];
// 输入字符串
char str[255];
//输入指针
char *p;
// DFA算法
void DFA(char *p);
// 返回输入串x的下一个符号
char nextChar();
// f(K,c)转换函数
char f(char K, char c);
int main()
{
printf("请输入待检验的字符串:");
while(scanf("%s",str) != EOF)
{
p = str;
DFA(str);
printf("请输入待检验的字符串:");
}
return 0;
}
void DFA(char *p)
{
char K = S;
char c = nextChar();
int i = 0;
while(c != '\0')
{
K = f(K,c);
c = nextChar();
}
// 判断K是否在接收状态Z中
for(int i = 0; i < ZNUM; i++)
{
if(K == Z[i])
{
printf("yes\n");
return;
}
}
printf("no\n");
}
char nextChar()
{
return *p++;
}
char f(char K, char c)
{
for(int i=0;i<KNUM;i++)
for(int j=0;j<LNUM;j++)
table[i][j]=-1;
table['S']['a'] = 'U';
table['S']['b'] = 'V';
table['U']['a'] = 'Q';
table['U']['b'] = 'V';
table['V']['a'] = 'U';
table['V']['b'] = 'Q';
table['Q']['a'] = 'Q';
table['Q']['b'] = 'Q';
return table[K][c];
}
标签:char,return,状态,词法,模拟程序,DFA,输入,define 来源: https://www.cnblogs.com/zenglearn/p/16256176.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。