Jesus Alejandro Flores Hernandez
Clase para la evaluación de expresiones en notación polca inversa
Revisado en Dic 07 a parti del curso de POO del seg sem 2006
Evalua funciones en polaca inversa es usada por la clse Graficadora
*/
import java.util.StringTokenizer;
import java.util.Stack;
import java.util.EmptyStackException;
public class calcPolaca{
public double resultado;
boolean operador = false;
boolean funcion = false;
Stack p;
calcPolaca(String cad){
StringTokenizer cadena = new StringTokenizer(cad,",");
p = new Stack();
while (cadena.hasMoreTokens()){
String token = cadena.nextToken();
if (token=="=")break;
p.push(token);
if (func(token)){
calcularfunc();
}else{
if (oper( token )){
calcularop();
}
}
}
resultado = Double.parseDouble((String)(p.pop()));
}
private void calcularfunc(){
String token = (String)(p.pop());
String x = (String)(p.pop());
switch (token.charAt(0)){
case 'S':
p.push( String.valueOf( Math.sin( Double.parseDouble(x) )));
break;
case 'C':
p.push( String.valueOf( Math.cos( Double.parseDouble(x) )));
break;
case 'T':
p.push( String.valueOf( Math.tan( Double.parseDouble(x) )));
break;
case 'L':
try {
p.push( String.valueOf( Math.log(Double.parseDouble(x))));
break;
}catch (Exception e){
System.out.println("error");
}
case 'A':
p.push( String.valueOf( Math.abs( Double.parseDouble(x) )));
break;
default :
System.out.println("incorrecto");
}
}
public boolean func(String ffun){
switch (ffun.charAt(0)){
case 'S':
funcion = true;
break;
case 'C':
funcion = true;
break;
case 'A':
funcion = true;
break;
case 'L':
funcion = true;
break;
case 'T':
funcion = true;
break;
default:
funcion = false;
}
return(funcion);
}
private void calcularop(){
String operador = (String)(p.pop());
String op1 = (String)(p.pop());
String op2 = (String)(p.pop());
switch (operador.charAt(0)){
case '+':
p.push( String.valueOf (Double.parseDouble(op2)+ Double.parseDouble(op1)) );
break;
case '-':
p.push( String.valueOf (Double.parseDouble(op2) - Double.parseDouble(op1)) );
break;
case '*':
p.push( String.valueOf (Double.parseDouble(op2) * Double.parseDouble(op1)) );
break;
case '/':
p.push( String.valueOf (Double.parseDouble(op2) / Double.parseDouble(op1)) );
break;
case '^':
p.push( String.valueOf (Math.pow (Double.parseDouble(op2),Double.parseDouble(op1))) );
break;
default :
System.out.println("incorrecto");
}
}
public boolean oper(String opr){
if (opr.length() == 1 ){
char x = opr.charAt(0);
switch (x){
case '+':
operador = true;
break;
case '-':
operador = true;
break;
case '*':
operador = true;
break;
case '/':
operador = true;
break;
case '^':
operador = true;
break;
default :
operador = false;
}
}else
operador = false;
return(operador);
}//fin de oper
public static void main(String[] args){
calcPolaca aux = new calcPolaca("10,2,^ ".trim());
double valor = aux.resultado;
System.out.println(valor);
}
}//fin de la clase polaca
No hay comentarios:
Publicar un comentario