Programa para compilar DFA que acepta los idiomas que terminan en «01» sobre los caracteres {0, 1}

Dada una string binaria str , la tarea es crear un DFA que acepte los idiomas que terminan en «01» sobre los caracteres {0, 1} .

Ejemplos:

Entrada: str = “00011101”
Salida: String aceptada
Explicación:
Como la string dada termina en “01”, por lo tanto, se acepta.

Entrada: str = “00001111”
Salida: String rechazada
Explicación:
Como la string dada termina en “11”, por lo tanto, se rechaza.

Enfoque: para resolver el problema anterior, a continuación se muestran el estado de la clase y la función miembro necesaria:

  • Par 1: trata con el primer tipo de entrada, es decir, 0, y lo vincula con un puntero de objeto al siguiente estado.
  • Par 2: se ocupa del segundo tipo de entrada, es decir, 1, y lo vincula con un puntero de objeto al siguiente estado.
  • m_x: Define si un determinado estado es inicial o final.

Las funciones de miembro de clase se definen a continuación:

  • initialize(): esta función toma los dos pares (utilizados para dos tipos de entradas) como parámetros junto con el carácter que define el estado (i o f).
  • transición(): actúa como una tabla de transición para los autómatas y con una entrada particular, pasa de un estado al siguiente estado.
  • traverse(): esta función toma la string de entrada y la pasa a través de los autómatas.
  • check(): esta función verifica si después de que la entrada ha finalizado, el estado final es un estado final o no. Si es final, la string se acepta; de lo contrario, se rechaza.

Para este problema se necesitan tres estados. Por lo tanto, cree objetos de tres clases e inicialícelos con los valores requeridos como:

  • Estado 1: En la entrada 0 pasa al Estado 2 y en la entrada 1 pasa a sí mismo.
  • Estado 2: En la entrada 0 va a sí mismo y en la entrada 1 va al Estado 3.
  • Estado 3: En la entrada 0 va al Estado 2 y en la entrada 1 va al Estado 1. Además, este es nuestro estado final.

A continuación se muestra la implementación del enfoque anterior:

C++14

// C++ program of a DFA that accepts
// all string ending with "01"
  
#include <iostream>
#include <string>
using namespace std;
  
// Class for automata
class State {
private:
    // Data members to store the input
    pair<int, State*> Pair1;
    pair<int, State*> 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<int, State*> pair1,
        pair<int, State*> 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<int>(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;
}
Producción:

String Accepted

Complejidad temporal: O(N)
Espacio auxiliar: O(1)

Publicación traducida automáticamente

Artículo escrito por gbhardwaj y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *