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.toUpperCase();
String operador="";
int num1, num2;
num1=0;
num2=0;
int conta=0;
//Cada caractere
char 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 = res.toUpperCase().charAt(i);
if(ch>='0')
{
p.push(ch);
}
else if(ch=='+' || ch=='-' || ch=='*' || ch=='/')
{
//tenho q converter o ch para string e depois calcular com os valores q ja estao na pilha
if(ch=='+')
{
num1=0;
num2=0;
conta=0;
num1=Integer.parseInt(p.pop().toString());
num2=Integer.parseInt(p.pop().toString());
conta=num2+num1;
p.push(conta);
}
else if(ch=='-')
{
num1=0;
num2=0;
conta=0;
num1=Integer.parseInt(p.pop().toString());
num2=Integer.parseInt(p.pop().toString());
conta=num2-num1;
p.push(conta);
}
else if(ch=='*')
{
num1=0;
num2=0;
conta=0;
num1=Integer.parseInt(p.pop().toString());
num2=Integer.parseInt(p.pop().toString());
conta=num2*num1;
p.push(conta);
}
else if(ch=='/')
{
num1=0;
num2=0;
conta=0;
num1=Integer.parseInt(p.pop().toString());
num2=Integer.parseInt(p.pop().toString());
conta=num2/num1;
p.push(conta);
}
}
}
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)));
}
}
Segue arquivo da pilha:
import javax.swing.*;
public class Pilha {
private int topo; //Topo da Pilha
private int MAX; //Tamanho da Pilha
private Object memo[]; //Elementos da Pilha (objeto genérico)
//Método que inicializa a Pilha no estado vazia
public Pilha() {
topo=-1;
MAX=30;
memo = new Object[MAX];
}
//Método que verifica se a Pilha está Vazia
public boolean isEmpty() {
return(topo==-1);
}
//Método que verifica se a Pilha está cheia
public boolean isFull() {
return(topo==MAX-1);
}
//Método para inserir um valor na Pilha
public void push(Object x) {
if(!isFull()) {
topo++;
memo[topo]=x;
}
else {
JOptionPane.showMessageDialog(null, "Pilha Cheia!!");
}
}
//Método para exibir o conteúdo da Pilha
public void print() {
if(!isEmpty()) {
String msg = "";
for(int i=0; i<=topo; i++) {
msg += memo[i].toString() + ", ";
}
JOptionPane.showMessageDialog(null, "P: [ "+msg+" ]");
}
else {
JOptionPane.showMessageDialog(null, "Pilha Vazia!!");
}
}
//Método para retornar o topo da Pilha e remove-lo
public Object pop() {
if(!isEmpty())
return memo[topo--];
else
return null;
}
//Método que retorna o topo da pilha sem removê-lo
public Object top() {
if(!isEmpty())
return memo[topo];
else
return null;
}
public boolean find(Object x) {
for(int i=0; i<=topo; i++) {
if(memo[i].toString().equals(x.toString()))
return true;
}
return false;
}
}