📜  NFA接受字母{0,1,2}上的一组字符串,以使最后一位出现在

📅  最后修改于: 2021-08-24 05:07:30             🧑  作者: Mango

先决条件–有限自动机简介
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”出现在字符串的末尾,因此被接受。

方法:

  1. 构造一个开始状态。
  2. 为输入0、1和2构造3个状态。
  3. 在所有输入的所有状态下重复循环。
  4. 将所有状态与最终状态连接起来。

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;
}