#include <iostream>
#include <stack>
#include <string>
using namespace std;
// Función para simular el autómata de pila y mostrar los estados
bool automataDePila(const string& entrada) {
stack<char> pila;
char estado = 'i'; // Estado inicial
[Link]('#'); // Insertar el símbolo de fondo de pila
cout << "Estado actual: " << estado << endl;
estado = 'p';
cout << "Estado actual: " << estado << endl;
[Link]('S'); // Insertar el símbolo inicial S
estado = 'q';
cout << "Estado actual: " << estado << endl;
size_t i = 0; // Índice para recorrer la cadena de entrada
char cima;
while (![Link]()) {
cima = [Link]();
[Link]();
if (estado == 'q') {
switch (cima) {
case 'S':
if (i < [Link]() && entrada[i] == 'x') {
[Link]('S');
[Link]('y');
[Link]('x');
cout << "Transición: λ, S; xSy" << endl;
} else {
cout << "Transición: λ, S; λ" << endl;
}
break;
case 'x':
if (i < [Link]() && entrada[i] == 'x') {
cout << "Transición: x, x; λ" << endl;
i++;
} else {
return false; // Error si no coincide
}
break;
case 'y':
if (i < [Link]() && entrada[i] == 'y') {
cout << "Transición: y, y; λ" << endl;
i++;
} else {
return false; // Error si no coincide
}
break;
case '#':
estado = 'f';
cout << "Estado actual: " << estado << endl;
break;
default:
break;
}
}
}
// La cadena es aceptada si estamos en el estado final y hemos procesado toda
la entrada
return estado == 'f' && i == [Link]();
}
void mostrarMenu() {
cout << "----- Menú -----\n";
cout << "1. Ingresar una cadena\n";
cout << "2. Salir\n";
cout << "Elija una opción: ";
}
int main() {
int opcion;
string entrada;
do {
mostrarMenu();
cin >> opcion;
switch (opcion) {
case 1:
cout << "Ingrese la cadena de entrada: ";
cin >> entrada;
if (automataDePila(entrada)) {
cout << "La cadena es aceptada y ha llegado al estado de
aceptación.\n";
} else {
cout << "La cadena no es aceptada y no ha llegado al estado de
aceptación.\n";
}
break;
case 2:
cout << "Saliendo...\n";
break;
default:
cout << "Opción no válida. Por favor, elija una opción válida.\n";
break;
}
} while (opcion != 2);
return 0;
}