Problema com resultado

1 resposta
X
Olá estou fazendo um algoritmo que pega uma conta com numeros, operadores e parenteses, daí ele transforma para NPR ("notacao polonesa reversa") e depois faz o calculo da conta respeitando os parenteses e os operadores, o código não mostra nenhum erro ao compilar, porém ao usar algum numero com mais de um caracter (dezena) a resposta sempre vem errada, ele só funciona com numeros de 0 à 9. ex: "1+4-3(8*2)", ele da a resposta direitinho, mas ao tentar fazer uma conta como "10+10" ele da resposta como "1", qualquer outra conta que tenha um numero seguido do outro, sem separar por paratenses ou operador não da o resultado correto.Ja estou quebrando minha cabeça faz uns 5 dias, se alguem souber o que fazer ficarei muito grato.Segue o codigo:
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;
   }
   
}

1 Resposta

M

Tenta refazer este código, porém a dica é:

use os valores empilhados na pilha:

pois o exemlo que você deu:

10+10

se trasnforma em

1010+

isso é totalmente ambiguo para o computador

1 + 010

10 + 10

101 + 0

agora se na pilha/fila(que deve ser mais facil pois voce ja le direto da esquerda para direita) tiver [10,10,+]

acaba com a ambiguidade e o resto do seu código permanece igual

Criado 5 de junho de 2010
Ultima resposta 5 de jun. de 2010
Respostas 1
Participantes 2