题目描述:
1. 通过状态转换图实现对单词的识别。 输入: 符号串 输出: yes / No – 该符号串是否符合状态转换图的定义 状态转换路径
2. 采用直接转向法实现
源码:
#include <iostream>
#include <string.h>
using namespace std;
bool confirm;
int state;
int no;
bool JudgeNum(char &a)
{
if(a >= '0' && a <= '9')
return true;
else
return false;
}
void analysis(string &a)//status=0,no=0
{
if(state == 0)
{
cout<<state<<" ";
if(JudgeNum(a[no]))//if a[no]是数字
{
state = 1;
no++;
analysis(a);
}
else//弹出0
{
confirm = false;
return;
}
}
else if(state == 1)//第一个是数字,判断第二个是数字还是小数点
{
//cout<<status<<" ";
if(JudgeNum(a[no]))
{
cout<<state<<" ";
state = 1;
no++;
analysis(a);
}
else if(a[no] == '.')
{
cout<<state<<" ";
state= 2;
no++;
analysis(a);
}
else if(a[no] == 'E')
{
cout<<state<<" ";
state = 4;
no++;
analysis(a);
}
else//输入3b返回yes
{
cout<<state<<" 8 ";
confirm=true;
return;
}
}
else if(state == 2)//是小数或整数
{
if(JudgeNum(a[no]))
{
cout<<state<<" ";
state = 3;
no++;
analysis(a);
}
else
{
confirm = false;
return;
}
}
else if(state == 3)
{
if(JudgeNum(a[no]))
{
cout<<state<<" ";
state = 3;
no++;
analysis(a);
}
else if(a[no]=='E')
{
cout<<state<<" ";
state=4;
no++;
analysis(a);
}
else
{
cout<<state<<" 9 ";
confirm=true;
return;
}
}
else if(state == 4)
{
if(a[no] == '+' || a[no] == '-')
{
cout<<state<<" ";
state = 5;
no++;
analysis(a);
}
else if(JudgeNum(a[no]))
{
cout<<state<<" ";
state=6;
no++;
analysis(a);
}
else
{
confirm = false;
return;
}
}
else if(state == 5)
{
if(JudgeNum(a[no]))
{
cout<<state<<" ";
state = 6;
no++;
analysis(a);
}
else
{
confirm = false;
return;
}
}
else if(state == 6)
{
if(JudgeNum(a[no]))
{
cout<<state<<" ";
state = 6;
no++;
analysis(a);
}
else
{
cout<<state<<" 7 ";
confirm = true;
return;
}
}
else
cout << "state error." << endl;
}
int main()
{
string a;
while(cin >> a)
{
confirm = false;
state = 0;
no = 0;
for(int i=0;i<a.size();i++)
cout<<a[i]<<" ";
cout<<endl;
analysis(a);
cout<<endl;
if(confirm)
cout << "yes" << endl;
else
cout << "no" << endl;
}
}
运行效果: