Problem Description
设DFA M=({S,U,V,Q},{a,b},f, S, {Q}) 其中f定义为:
f(S,a)=U f(V,a)=U
f(S,b)=V f(V,b)=Q
f(U,a)=Q f(Q,a)=Q
f(U,b)=V f(Q,b)=Q
DFA的状态转换关系如所示。
编写一个DFA程序,用于判断符号串t是否被DFA M接受?
Input
输入多行∑*上的符号串t,输入EOF结束。
Output
判断每行的符号串t能够被DFA M识别,如果可以识别,输出"accept";否则,输出"not accept"。
Sample Input
baab
ab
Sample Output
accept
not accept
代码:C++实现
#include <iostream>
using namespace std;
char f(char v1, char v2) {
char nextState;
if (v2 == 'a') {
if (v1 == 'S') { nextState = 'U'; }
else if (v1 == 'U'){ nextState = 'Q'; }
else if (v1 == 'V'){ nextState = 'U'; }
else if (v1 == 'Q'){ nextState = 'Q'; }
}
else if (v2 =='b'){
if (v1 == 'S') { nextState = 'V'; }
else if (v1 == 'U'){ nextState = 'V'; }
else if (v1 == 'V'){ nextState = 'Q'; }
else if (v1 == 'Q'){ nextState = 'Q'; }
}
return nextState;
}
int DFA(char* s) {
char S = 'S';
for (int i = 0; s[i]!='\0'; i++) {
S = f(S, s[i]);
}
if (S == 'Q') {
return 1;
}
else {
return 0;
}
}
int main() {
char s[50];
while(cin>>s){
if(DFA(s)) cout << "accept" << endl;
if(DFA(s)==0)cout << "not accept" << endl;
}
return 0;
}