ublic class Expresion {
public static void main(String[] args) {
final String CORRECTA = "(3+4)/ [3+(4-3)] ";
final String INCORRECTA = "(3+4)/ [3+4-3)]";
System.out.println("La expresión: " + CORRECTA);
System.out.println(checkExpresion(CORRECTA, 0, false, false)?"Es correcta":"Es incorrecta");
System.out.println("\nLa expresión: " + INCORRECTA);
System.out.println(checkExpresion(INCORRECTA, 0, false, false)?"Es correcta":"Es incorrecta");
}
/*
* Comprueba recursivamente si una expresion matemática es escrita correctamente
* según los paréntesis y corchetes que pueda contener.
* En cada llamada recursiva, se analizará un carácter de la expresión para detectar
* los paréntesis y corchetes y comprobar si el orden de apertura y cierre de estos
* es correcto.
* En cada llamada recursiva vamos a pasar 4 argumentos:
* - String expresion: La expresion que estamos comprobando.
* - int car: Posición del carácter que se analizará en cada llamada recursiva.
* - boolean paren: Indica si actualmente hay un paréntesis abierto(true) o cerrado(false)
* - boolean corch: Indica si actualmente hay un corchete abierto(true) o cerrado(false)
*
* Por ejemplo, si se encuentra un paréntesis abierto y su boolean correspondiente indica que
* YA estaba abierto, la expresión será incorrecta y se retornará false.
* En cambio, si el boolean indica que está cerrado, pues de momento la expresión es correcta.
* Así que el boolean pasará a true para indicar que ahora si hay un paréntesis abierto y se
* pasará a comprobar el siguiente carácter.
*
* Cuando ya se han comprobado todos los caracteres, es decir, si car == expresion.length()
* ya no se harán más llamadas recursivas.
* Llegados a este punto, la expresión solo se considerará correcta si los boolean paren y corch
* tienen valor false, es decir, que están cerrados y no ha quedado ninguno abierto.
*/
private static boolean checkExpresion(String expresion, int car, boolean paren, boolean corch) {
if (car == expresion.length()) { //Todos caracteres revisados
return !paren && !corch; //Será correcta si NO HAY parentesis ni corchetes abiertos
}
else { //Aún no hemos revisado todos los caracteres
//Comprobamos caracter
switch(expresion.charAt(car)) {
case '(':
//Si consta que ya hay abierto un paréntesis, la expresion está mal
if (paren) //Ya está abierto
return false; //Expresión errónea
else //No consta paréntesis abierto
paren = true; //Pues lo abrimos
break;
case ')':
if (!paren) //Ya está cerrado
return false; //Expresión errónea
else //No consta paréntesis cerrado
paren = false; //Pues lo cerramos
break;
case '[':
if (corch)
return false;
else
corch = true;
break;
case ']':
if (!corch)
return false;
else
corch = false;
}
//Switch ha terminado de evaluar caracter.
//Hacemos llamada recursiva para evaluar el siguiente
return checkExpresion(expresion , car+1, paren, corch);
}
}
}