先决条件–有限自动机简介
C++程序构造一个NFA,该NFA接受字母{0,1,2}上的字符串集,以使最后一位出现在前面。
例子 :
Input : 01101
Output : Accepted
Input : 012
Output : Not Accepted
Input : 2
Output : Not Accepted
Input : 0122
Output : Accepted
解释:
在第一个示例01101中,最后一个数字’1’出现在字符串的字母2和3处。因此,它被接受。在第二个示例012中,“ 2”的出现仅在最后一位。因此,它被拒绝了。与第三个示例类似,拒绝2。在最后一个示例中,最后一位数字“ 2”出现在字符串的末尾,因此被接受。
方法:
- 构造一个开始状态。
- 为输入0、1和2构造3个状态。
- 在所有输入的所有状态下重复循环。
- 将所有状态与最终状态连接起来。
NFA状态交易图:
执行 :
#include
using namespace std;
// function of state one or starting state
void q1(string s, int pos, int len);
// function of state two
void q2(string s, int pos, int len);
// function of state three
void q3(string s, int pos, int len);
// function of state four
void q4(string s, int pos, int len);
// function of state five
void q5(string s, int pos, int len);
// See diagram for help
vector states;
int accepted = 0;
// Uncomment this function and the function calls to see
// the path of string from the start state to end state
/*
void printVector()
{
for (auto i = states.begin(); i != states.end(); i++)
cout << *i << " ";
cout << endl;
}
*/
void q5(string s, int pos, int len)
{
states.push_back("Q5->");
if (pos == len) {
// printVector();
accepted = 1;
}
else {
states.push_back("Dead");
// printVector();
states.pop_back();
}
states.pop_back();
return;
}
void q4(string s, int pos, int len)
{
states.push_back("Q4->");
if (pos == len) {
// printVector();
states.pop_back();
return;
}
if (s[pos] == '2')
q5(s, pos + 1, len);
q4(s, pos + 1, len);
states.pop_back();
return;
}
void q3(string s, int pos, int len)
{
states.push_back("Q3->");
if (pos == len) {
// printVector();
states.pop_back();
return;
}
if (s[pos] == '1')
q5(s, pos + 1, len);
q3(s, pos + 1, len);
states.pop_back();
return;
}
void q2(string s, int pos, int len)
{
states.push_back("Q2->");
if (pos == len) {
// printVector();
states.pop_back();
return;
}
if (s[pos] == '0')
q5(s, pos + 1, len);
q2(s, pos + 1, len);
states.pop_back();
return;
}
void q1(string s, int pos, int len)
{
states.push_back("Q1->");
if (pos == len) {
// printVector();
states.pop_back();
return;
}
if (s[pos] == '0')
q2(s, pos + 1, len);
else if (s[pos] == '1')
q3(s, pos + 1, len);
else if (s[pos] == '2')
q4(s, pos + 1, len);
q1(s, pos + 1, len);
states.pop_back();
return;
}
int main()
{
string s;
// cin >> s;
s = "01101";
int pos = 0;
q1(s, pos, s.length());
if (accepted)
cout << "Accepted" << endl;
else
cout << "Not Accepted" << endl;
return 0;
}