Olá, pessoal eu não tô conseguindo criar um método [color=red]avaliaExpressao()[/color] que retorna o valor da avaliação da expressão. Alguém poderia me ajudar? abaixo segue o enunciado.
Avaliando a forma Pós-Fixa
Percorrendo qualquer expressão em notação polonesa reversa, da esquerda para a direita, ao encontrarmos um operador, sabemos que deve operar os dois últimos valores pelos quais passamos. Percebemos novamente a idéia que ?os últimos serão os primeiros processados? e novamente a aplicação de pilhas.
Vejamos um exemplo na expressão em NPR:
AB+CD-/E*
Vamos atribuir valores numéricos às variáveis da expressão a ser
avaliada:
A=7; B=3; C=6; D=4; E=9.
Avaliando a forma Pós-Fixa
Agora, seguiremos o algoritmo a seguir:
Iniciamos com uma pilha vazia;
Varremos a expressão da esquerda para a direita e para cada elemento encontrado:
Se for operando, empilhar;
Se for operador, desempilhar os dois últimos valores, efetuar a operação com eles e empilhar de volta o resultado obtido;
No final do processo, o resultado da avaliação estará no topo da pilha.
[color=red]Observação: Já tenho a Classe Pinha e NPR (Notação Polonesa Reversa).[/color]
package estatica;
import javax.swing.JOptionPane;
public class Pilha {
private Object memo[];
private int topo;
private int MAX;
public Pilha() {
this.topo = -1;
this.MAX = 30;
this.memo = new Object[MAX];
}
public boolean isEmpty() {
return (topo == -1);
}
public boolean isFull() {
return (topo == MAX-1);
}
public void push(Object x) {
if(!isFull()) {
topo++;
memo[topo] = x;
}
else {
JOptionPane.showMessageDialog(null, "Pilha Cheia");
}
}
public void print() {
if(!isEmpty()) {
String resp="";
for(int i=0; i<=topo; i++) {
resp += memo[i].toString() + ", ";
}
JOptionPane.showMessageDialog(null, resp);
}
else {
JOptionPane.showMessageDialog(null, "Pilha Vazia");
}
}
public Object pop() {
if(!isEmpty()) {
return memo[topo--];
}
else {
return null;
}
}
public Object top() {
if(!isEmpty()) {
return memo[topo];
}
else {
return null;
}
}
}
package aplicacoes;
import estatica.Pilha;
public class NPR {
private String infixa;
public String getInfixa() {
return infixa;
}
public void setInfixa(String infixa) {
this.infixa = infixa;
}
public String toNPR() {
String saida = "";
Pilha p = new Pilha();
for (int i = 0; i < infixa.length(); i++) {
char ch = infixa.charAt(i);
if ((ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z')) {
saida += ch;
}
if (ch == '+' || ch == '-' || ch == '*' || ch == '/') {
p.push(ch);
}
if (ch == ')') {
saida += p.pop();
}
}
return saida;
}
public String toNPR2() {
Pilha p = new Pilha();
String saida = "";
for (int i = 0; i < infixa.length(); i++) {
char ch = infixa.charAt(i);
if ((ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z')) {
saida += ch;
}
if (ch == '+' || ch == '-' || ch == '*' || ch == '/') {
while (!p.isEmpty() && prio(p.top().toString().charAt(0)) >= prio(ch)) {
saida += p.pop();
}
p.push(ch);
}
if (ch == '(') {
p.push(ch);
}
if(ch == ')') {
while(p.top().toString().charAt(0) != '(') {
saida += p.pop();
}
p.pop();
}
}
while(!p.isEmpty()) {
saida += p.pop();
}
return saida;
}
private 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 String avaliaExpressao() {
Pilha p = new Pilha();
String npr = toNPR2();
return p.top().toString();
}
}