import javax.swing.*;
public class NPR{
public static String NPR(String infixa) {
String saida = "";
char ch;
Pilha P = new Pilha();
//Converte para maiúsculas
infixa = infixa.toUpperCase();
//Varre a expressão da esquerda para a direita
for(int i=0; i<infixa.length(); i++) {
//Captura caracter por caractere
ch = infixa.charAt(i);
//Se for identificador(operando), copiar para a saída
if(ch>='0' && ch<='9')
saida += ch;
//Se for operador
if(ch=='+' || ch=='-' || ch=='*' || ch=='/') {
//Enquanto a pilha não estiver vazia e houver no seu topo
//um operador com prioridade maior ou igual ao encontrado
while(!P.isEmpty() && prio(P.top().toString().charAt(0))>=prio(ch))
{
//Desempilha o operador e coloque na saída
saida += P.pop();
}
//Empilhe o operador encontrado
P.push(ch);
}
//Se for parênteses de abertura, empilhe-o
if(ch=='(')
P.push(ch);
//Se for parênteses de fechamento
if(ch==')') {
//Enquanto não encontrar o parênteses de abertura correspondente
while(!P.top().toString().equals("(")) {
//Desempilhe o operador e coloque na saída
saida += P.pop();
}
//Tirar o parênteses de abertura
P.pop();
}
}
//Esvaziar a pilha na saída
while(!P.isEmpty())
saida += P.pop();
return saida;
}
public static int prio(char op){
int resp=0;
switch(op) {
case '(': resp = 1; break;
case '+': resp = 2; break;
case '-': resp = 2; break;
case '*': resp = 3; break;
case '/': resp = 3; break;
}
return resp;
}
public static String avaliaExpressao(String resultado)
{
String res=resultado;
String operador="";
int num1, num2;
num1=0;
num2=0;
int conta=0;
//Cada caractere
int ch;
//Instanciar uma pilha
Pilha p = new Pilha();
//Varre a expressão da esquerda para a direita
for(int i=0; i<res.length();i++)
{
//Pega caractere por caracter
ch = Integer.parseInt(res);
if(ch>= 0 && ch<=1000000)
{
p.push(ch);
}
switch(ch) {
case '+':
num1=0;
num2=0;
conta=0;
num1=Integer.parseInt(p.pop().toString());
num2=Integer.parseInt(p.pop().toString());
conta=num2+num1;
p.push(conta);
break;
case '-':
num1=0;
num2=0;
conta=0;
num1=Integer.parseInt(p.pop().toString());
num2=Integer.parseInt(p.pop().toString());
conta=num2+num1;
p.push(conta);
break;
case '*':
num1=0;
num2=0;
conta=0;
num1=Integer.parseInt(p.pop().toString());
num2=Integer.parseInt(p.pop().toString());
conta=num2+num1;
p.push(conta);
break;
case '/':
num1=0;
num2=0;
conta=0;
num1=Integer.parseInt(p.pop().toString());
num2=Integer.parseInt(p.pop().toString());
conta=num2+num1;
p.push(conta);
break;
}
}
res=p.top().toString();
return res;
}
public static void main(String args[])
{
String str = JOptionPane.showInputDialog(
"Entre com a empressão infixa");
JOptionPane.showMessageDialog(null,"Expressão em NPR: "+ NPR.NPR(str));
JOptionPane.showMessageDialog(null,"Resultado: " + NPR.avaliaExpressao(NPR.NPR(str)));
}
}
meu codigo esta usando instanciando uma classe de pilha… eu compilo de boa, digito a expressão de boa, aparece a expressão em NPR(notação polonesa reversa) mas na hora de mostrar o redultado da pau. Este é o erro que esta dando
Exception in thread "main" java.lang.NumberFormatException: For input string: "22+"
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:48)
at java.lang.Integer.parseInt(Integer.java:458)
at java.lang.Integer.parseInt(Integer.java:499)
at NPR.avaliaExpressao(NPR.java:95)
at NPR.main(NPR.java:202)
