Hola!!
Me podrías ayudar con este tema por favor!!
Apenas estoy aprendiendo de autómatas y no sé manejar muy bien el lenguaje de java. No logre que llegara al estado de aceptación.
. Construir un autómata de pila que reconozca secuencias de la forma 0^m1^2n0^n1^m, con m,n>0.
package apila;
import java.util.Stack;
import javax.swing.JOptionPane;
/**
*
* @author Gisela
*/
public class APila {
boolean aceptado;
Stack<String> pila=new Stack<String>();
int cont;
public static char [] car;
public static void main(String[] args) {
APila aut = new APila();
String expresion;
expresion =JOptionPane.showInputDialog("Ingrese una secuencia 0^m1^2n0^n1^m ");
car=expresion.toCharArray();
aut.Inicio();
if(aut.aceptado){
JOptionPane.showMessageDialog(null, "La Expresion "+expresion+" es aceptada para la secuencia","Exito",JOptionPane.INFORMATION_MESSAGE);
System.out.println("Cadena aceptada");
}else{
JOptionPane.showMessageDialog(null, "La Expresion "+expresion+" NO es aceptada para la secuencia","Fallo",JOptionPane.WARNING_MESSAGE);
System.out.println("Cadena no Aceptada");
}
}
private void Inicio() {
cont=0;
pila.push("*");
aceptado=false;
s0();
}
public void s0() {
if(cont<car.length){
switch(car[cont]) {
case '0':
//#1 Si viene 0 y hay * Replace (0*), s0, avance
if(pila.peek().equals("*")){
pila.pop();
pila.push(String.valueOf(car[cont]));
pila.push("*");
cont++;
s0();
//#3 si viene 0 y hay + Desapile, s0, retenga
}else if(pila.peek().equals("+")){
pila.pop();
s1();
//#5 si viene 0 y hay 1 Desapile, s1, avance
}else if(pila.peek().equals("1")){
pila.pop();
cont++;
s1();
}
break;
case '1':
//#2 Si viene 1 y hay *o un + replace (1+), s0, avance
if((pila.peek().equals("*"))||(pila.peek().equals("+"))){
pila.pop();
pila.push(String.valueOf(car[cont]));
pila.push("+");
cont++;
s0();
}
break;
default:
break;
}
}
}
public void s1(){
if(cont<car.length){
switch(car[cont]) {
case '0':
//#4 Si viene 0 y hay 1 Desapile, s0, retenga
if(pila.peek().equals("1")){
pila.pop();
s0();
}
break;
case '1':
//#6 Si hay 0 y viene 1 desapile, s1, avance
if(pila.peek().equals("0")){
pila.pop();
cont++;
s1();
}
break;
default:
//Aceptacion
if((pila.isEmpty())&&(cont<car.length)){
aceptado=true;
}else{
qError();
break;
}
}
}
}
public void qError() {
System.out.println("En Error");
aceptado= false;
}
}