/**
*Metodo chamado para verificar balanceamente de parentesis quando o utilizador pressiona o respectivo botao
*este metodo utiliza um metodo auxiliar para a implementacao recursiva do algoritmo
*@param expressao expressao no formato infix
*/
void verificarParentesis(String expressao) {
String parAbrir = "([{";
String parFechar = ")]}";
StringTokenizer strtknzr = new StringTokenizer(expressao, parAbrir + parFechar,true);
verificarParentesisRecursivoAux(expressao,"",parAbrir,parFechar,strtknzr);
}
/**
*metodo auxiliar para implementacao recursiva do algoritmo de verificacao de balanceamento dos parentesis
*a string é percorrida recursivamente de forma verificar se um tipo de parentesis é fechado por outro simetrico
*@param expressao expressao no formato infix (note-se que nao vai ser usada, por isso pode ser suprimida)
*@param lidos string que vai guardar os caracteres(parentesis) que foram lidos e esperam confirmacao de "casamento" com simetrico
*@param parAbrir string que guarda os parentesis esquerdos para comparacoes
*@param parFechar string que guarda os parentesis direitos para comparacoes
*@param strtknzr string que guarda os token retirados da expressao, contem somente os parentesis , na ordem original
*/
void verificarParentesisRecursivoAux(String expressao, String lidos, String parAbrir,String parFechar, StringTokenizer strtknzr){
if(!strtknzr.hasMoreTokens()){
txtResultado.setText("Nao introduziu parentesis");
return;
}
String tokenComparar = strtknzr.nextToken();
if(parAbrir.indexOf(tokenComparar) >= 0){ //signfica que o token é um parentesis do parAbrir
//expressao.substring(1,expressao.length()-1);
lidos=lidos.concat(tokenComparar);
verificarParentesisRecursivoAux(expressao,lidos,parAbrir,parFechar,strtknzr);
}
else if(parFechar.indexOf(tokenComparar) >= 0){ //significa que o token é um parentesis do parFechar
if(lidos.compareTo("") == 0){ //se a string lidos estiver vazia
txtResultado.setText("A expressao contem mais parentesis a FECHAR do que a ABRIR");
return;
}else{
String aux = lidos.substring(lidos.length()-1); //atribuido o ultimo valor da string lido
lidos = lidos.substring(0,lidos.length()-2); //retira o valor mais a direita da string
if(parAbrir.indexOf(aux) != parFechar.indexOf(tokenComparar)){ //se o parentesis do parFechar nao casar com o parentesis do parAbrir
txtResultado.setText("Encontrou "+tokenComparar+" em vez de "+parFechar.charAt(parAbrir.indexOf(lidos.charAt(parAbrir.indexOf(aux)))));
return;
}
verificarParentesisRecursivoAux(expressao,lidos,parAbrir,parFechar,strtknzr); //se for fechar e casar o parAbrir com parFechar volta a comparar
}
}
if(!strtknzr.hasMoreTokens() && lidos.compareTo("") != 0) //se nao houver mais tokens e a string nao estiver vazia
txtResultado.setText("A expressao contem mais parentesis a ABRIR do que a FECHAR");
else
txtResultado.setText("Expressao correcta");
}
/*Aqui fica a minha conclusão, ainda com bugs, que devido a carga de trabalhos que tenho, não vou ter oportunidade de resolver, podem estar claros, mas sinceramente, nao consigo olhar mais para este exercicio
se houver alguem interessado em continuar o meu trabalho, sera bem-vindo.
boa noite pro pessoal e boas programacoes*/