Bom, dessa vez estou realmente perto de finalizar esse programa que está a alguns dias me assombrando, mas deparei-me com um probleminha de lógica.
Preciso apenas realizar três validações nesse código. Primeiro validar de o primeiro elemento da pilha não é um operando, então como verão abaixo tentei acrescentar o código:if( ex.substring(0,1)=="+"||
ex.substring(0,1)=="-"||
ex.substring(0,1)=="*"||
ex.substring(0,1)=="/"){
valido = false;
}
Mas acontece que aparentemente essa validação nunca é feita, pois independente do que eu entre como primeiro elemento sempre recebo a confimação de expressão válida.
E segundo eu precisaria verificar se o último elemento da pilha é um operando. Acontece que por mais que eu invoque o método "top()" sempre recebo o valor null como retorno.
E por fim precisaria verificar se tem 2 (ou mais) sinais consecutivos (exemplo A++B).
Alguma alma caridosa poderia me encaminhar a partir daqui?
Abaixo tem um pedaço do meu código onde é realizada a validação, imagino que seja o suficiente.
Agradeço desde já.
package Conversor;
import javax.swing.JOptionPane;
public class Conversor {
private PilhaDin p = new PilhaDin();
private ParteGrafica G = new ParteGrafica();
private String po = "";
private boolean valido = true;
private String ex;
private int pr;
private Object x;
private int pos = -1;
public Conversor(String expressao) {
setEx(expressao);
if (Valida() == false) {
JOptionPane.showMessageDialog(G.panel, "Por favor corrija a expressão");
}
Converte();
Operacao();
}
public boolean Valida() {
int j = 1;
for (int i = 0; i < ex.length(); i++) {
if (ex.substring(i, j).equals("(")) {
p.push(ex.substring(i, j));
}
if (ex.substring(i, j).equals(")")) {
if (p.isEmpty() == true) {
valido = false;
}else {
p.pop();
}
}
j++;
}
if( ex.substring(0,1)=="+"||
ex.substring(0,1)=="-"||
ex.substring(0,1)=="*"||
ex.substring(0,1)=="/"){
valido = false;
}
if (p.isEmpty() != true) {
valido = false;
}
if (valido == true) {
JOptionPane.showMessageDialog(G.panel, "Expressão Válida");
return true;
} else {
JOptionPane.showMessageDialog(G.panel, "Expressão Inválida");
return false;
}
}
public int prioridade(Object op) {
if (op.equals("("))
return 1;
if (op.equals("+") || op.equals("-"))
return 2;
if (op.equals("*") || op.equals("/"))
return 3;
return 0;
}
public void Converte() {
Object[] npos = new Object[ex.length()];
String[] infixa = new String[ex.length()];
int j = 1;
for (int i = 0; i < ex.length(); i++) {
infixa[i] = ex.substring(i, j);
j++;
}
for (int i = 0; i < infixa.length; i++) {
if (infixa[i].equalsIgnoreCase("A")
|| infixa[i].equalsIgnoreCase("B")
|| infixa[i].equalsIgnoreCase("C")
|| infixa[i].equalsIgnoreCase("D")
|| infixa[i].equalsIgnoreCase("E")
|| infixa[i].equalsIgnoreCase("F")
|| infixa[i].equalsIgnoreCase("G")
|| infixa[i].equalsIgnoreCase("H")
|| infixa[i].equalsIgnoreCase("I")
|| infixa[i].equalsIgnoreCase("J")
|| infixa[i].equalsIgnoreCase("K")
|| infixa[i].equalsIgnoreCase("L")
|| infixa[i].equalsIgnoreCase("M")
|| infixa[i].equalsIgnoreCase("N")
|| infixa[i].equalsIgnoreCase("O")
|| infixa[i].equalsIgnoreCase("P")
|| infixa[i].equalsIgnoreCase("Q")
|| infixa[i].equalsIgnoreCase("R")
|| infixa[i].equalsIgnoreCase("S")
|| infixa[i].equalsIgnoreCase("T")
|| infixa[i].equalsIgnoreCase("U")
|| infixa[i].equalsIgnoreCase("V")
|| infixa[i].equalsIgnoreCase("X")
|| infixa[i].equalsIgnoreCase("W")
|| infixa[i].equalsIgnoreCase("Y")
|| infixa[i].equalsIgnoreCase("Z")) {
pos++;
npos[pos] = infixa[i];
} else if (infixa[i].equals("+") || infixa[i].equals("-")
|| infixa[i].equals("/") || infixa[i].equals("*")) {
pr = prioridade(infixa[i]);
while (p.isEmpty() != true && prioridade(p.top()) >= pr) {
pos++;
npos[pos] = p.pop();
}
p.push(infixa[i]);
} else if (infixa[i].equalsIgnoreCase("(")) {
p.push(infixa[i]);
} else if (infixa[i].equalsIgnoreCase(")")) {
x = p.pop();
while (!x.equals("(")) {
pos++;
npos[pos] = x;
x = p.pop();
}
}
}
while (p.isEmpty() != true) {
pos++;
npos[pos] = p.pop();
}
for (int i = 0; i < npos.length; i++) {
if (npos[i] == null) {
npos[i] = "";
}
po = po + npos[i];
}
}
public void Operacao() {
p.init();
String[] infixa = new String[ex.length()];
double[] val_infixa = new double[ex.length()];
int j = 1;
for (int i = 0; i < po.length(); i++) {
infixa[i] = po.substring(i, j);
j++;
}
for (int i = 0; i < po.length(); i++) {
if (infixa[i].equalsIgnoreCase("A")
|| infixa[i].equalsIgnoreCase("B")
|| infixa[i].equalsIgnoreCase("C")
|| infixa[i].equalsIgnoreCase("D")
|| infixa[i].equalsIgnoreCase("E")
|| infixa[i].equalsIgnoreCase("F")
|| infixa[i].equalsIgnoreCase("G")
|| infixa[i].equalsIgnoreCase("H")
|| infixa[i].equalsIgnoreCase("I")
|| infixa[i].equalsIgnoreCase("J")
|| infixa[i].equalsIgnoreCase("K")
|| infixa[i].equalsIgnoreCase("L")
|| infixa[i].equalsIgnoreCase("M")
|| infixa[i].equalsIgnoreCase("N")
|| infixa[i].equalsIgnoreCase("O")
|| infixa[i].equalsIgnoreCase("P")
|| infixa[i].equalsIgnoreCase("Q")
|| infixa[i].equalsIgnoreCase("R")
|| infixa[i].equalsIgnoreCase("S")
|| infixa[i].equalsIgnoreCase("T")
|| infixa[i].equalsIgnoreCase("U")
|| infixa[i].equalsIgnoreCase("V")
|| infixa[i].equalsIgnoreCase("X")
|| infixa[i].equalsIgnoreCase("W")
|| infixa[i].equalsIgnoreCase("Y")
|| infixa[i].equalsIgnoreCase("Z")) {
val_infixa[i] = Double.parseDouble(JOptionPane
.showInputDialog(G.frame,"Digite o valor de: "
+ infixa[i]));
p.push(val_infixa[i]);
} else if (infixa[i].equals("+") || infixa[i].equals("-")
|| infixa[i].equals("/") || infixa[i].equals("*")) {
Double x1 = (Double) p.pop();
Double y = (Double) p.pop();
if (infixa[i].equals("+")) {
p.push(x1.doubleValue() + y.doubleValue());
}
if (infixa[i].equals("-")) {
p.push(x1.doubleValue() - y.doubleValue());
}
if (infixa[i].equals("*")) {
p.push(x1.doubleValue() * y.doubleValue());
}
if (infixa[i].equals("/")) {
p.push(x1.doubleValue() / y.doubleValue());
}
}
}
Object resultado = p.pop();
G.TextFieldPosFixa.setText(po);
String strResul = resultado.toString();
G.TextFieldResultado.setText(strResul);
}
public void setEx(String ex) {
this.ex = ex;
}
}
Mas também não parei para analisar.