Notação polonesa reversa (forma Pós-Fixa)

0 respostas
Jericho

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();
        
    }
    
}
Criado 30 de março de 2013
Respostas 0
Participantes 1