📌  相关文章
📜  创建DFA的程序,该DFA接受字符{0,1}上以“ 01”结尾的语言

📅  最后修改于: 2021-08-29 11:42:38             🧑  作者: Mango

给定二进制字符串str ,任务是构建一个DFA,该DFA接受在字符{0,1}上“ 01”结尾的语言。

例子:

方法:为解决上述问题,下面是所需的类状态和成员函数:

  • 对1:处理第一种输入类型,即0,并将其与指向下一个状态的对象指针链接。
  • 配对2:处理第二种输入类型,即1,并将其与指向下一个状态的对象指针链接。
  • m_x:定义特定状态是初始状态还是最终状态。

类成员函数定义如下:

  • initialize():此函数将两对(用于两种输入)作为参数以及状态定义字符(i或f)。
  • transition():这充当自动机的过渡表,并通过特定输入从一个状态转到下一个状态。
  • traverse():此函数获取输入字符串,并将其通过自动机传递。
  • check():此函数检查输入结束后,结束状态是否为最终状态。如果它是最终的,则该字符串被接受,否则被拒绝。

对于此问题,需要三个状态。因此,创建三类对象,并使用所需的值将它们初始化为:

  • 状态1:输入0进入状态2,输入1进入自身。
  • 状态2:输入0进入状态,输入1进入状态3。
  • 状态3:输入0进入状态2,输入1进入状态1。这也是我们的最终状态。

下面是上述方法的实现:

C++14
// C++ program of a DFA that accepts
// all string ending with "01"
  
#include 
#include 
using namespace std;
  
// Class for automata
class State {
private:
    // Data members to store the input
    pair Pair1;
    pair Pair2;
    char m_x;
  
public:
    // Pointer to the state of automata
    static State* m_ptr;
  
    // Constructor to initialize state
    State()
    {
        Pair1.first = 0;
        Pair1.second = nullptr;
        Pair2.first = 0;
        Pair2.second = nullptr;
        m_x = ' ';
    }
  
    // Initialise pair1 and pair2
    // with state x
    void initialize(
        pair pair1,
        pair pair2, char x)
    {
        Pair1 = pair1;
        Pair2 = pair2;
        m_x = x;
    }
  
    // Passes a string through automata
    static void transition(int input);
    static void traverse(string& str, int n);
  
    // Checks if the last state
    // is final or not
    static void check();
};
  
// Pointer to the current
// state of automata
State* State::m_ptr{ nullptr };
  
// Function to provide state
// transition of automata
void State::transition(int input)
{
    if ((*m_ptr).Pair1.first == input)
        m_ptr = (*m_ptr).Pair1.second;
    else
        m_ptr = (*m_ptr).Pair2.second;
}
  
// Checks if the last state
// is final or not
void State::check()
{
    if ((*m_ptr).m_x == 'f')
        cout << "String Accepted\n"
             << endl;
    else
        cout << "String Rejected\n"
             << endl;
}
  
// Passes a string through automata
void State::traverse(string& str, int n)
{
    for (int i = 0; i < n; i++) {
        int x{ (int)str[i] - (int)'0' };
        transition(x);
    }
}
  
// Function to check if the given
// is accepted in DFA or not
void isAccepted(string str)
{
    // States of the automata
    State one, two, three;
  
    // Transition table for required
    // automata
    one.initialize({ 0, &two },
                   { 1, &one }, 'i');
    two.initialize({ 0, &two },
                   { 1, &three }, 'i');
    three.initialize({ 0, &two },
                     { 1, &one }, 'f');
  
    int length{ static_cast(str.length()) };
    State::m_ptr = &one;
  
    // Function call
    State::traverse(str, length);
    State::check();
}
  
// Driver Code
int main()
{
    string str{ "00111101" };
  
    isAccepted(str);
  
    return 0;
}


输出:
String Accepted

时间复杂度: O(N)
辅助空间: O(1)