// ====================================================================== // Objetivo: Evaluar una expresiOn en postfijo // Autor: J. Rafael R. Ochoa // Fecha: Julio 2004, // Derechos: SID - FIE - UMSNH // ====================================================================== import java.util.Stack; import java.util.StringTokenizer; class EvaluaPostfija { String EPF = "", Opr = ""; // EPF=ExpresinPostFija; Opr=Operador Stack Pila; EvaluaPostfija(String EPF) { this.EPF = EPF; this.Pila = new Stack(); } double Evalua(double VX) { double Val1 = 0, Val2 = 0, Resp = 0; StringTokenizer ST = new StringTokenizer(EPF); String Symb = ""; while(ST.hasMoreTokens()) { Symb = ST.nextToken(); if (EsOperando(Symb.charAt(0))) { if (EsX(Symb.charAt(0))) Pila.push((Object)(""+VX)); else Pila.push((Object)Symb); } else if (EsFuncion(Symb.charAt(0))) { Val1 = Double.parseDouble((String)Pila.pop()); Resp = EvalFuncion(Symb.charAt(0), Val1); Pila.push((Object)(""+Resp)); } else { Val2 = Double.parseDouble((String)Pila.pop()); Val1 = Double.parseDouble((String)Pila.pop()); Resp = EvalOperador(Symb.charAt(0), Val1, Val2); Pila.push((Object)(""+Resp)); } } return Double.parseDouble((String)Pila.pop()); } boolean EsX(char Simbolo) { if ("xX".indexOf(Simbolo) >= 0) return true; return false; } boolean EsOperando(char Simbolo) { if ("0123456789.xX".indexOf(Simbolo) >= 0) return true; return false; } double EvalOperador(char Oper, double Val1, double Val2) { double Resp = 0; switch (Oper) { case '+': Resp = Val1 + Val2; break; case '-': Resp = Val1 - Val2; break; case '*': Resp = Val1 * Val2; break; case '/': Resp = Val1 / Val2; break; case '^': Resp = Math.pow(Val1, Val2); break; } return Resp; } // seno, coseno, tangente, log base e // ___________________________________ boolean EsFuncion(char Simbolo) { if ("sencotalgSENCOTALG".indexOf(Simbolo) >= 0) return true; return false; } double EvalFuncion(char Funcion, double Valor) { double Resp = 0; switch (Funcion) { case 's': Resp = Math.sin(Math.toRadians(Valor)); break; case 'c': Resp = Math.cos(Math.toRadians(Valor)); break; case 't': Resp = Math.tan(Math.toRadians(Valor)); break; case 'l': Resp = Math.log(Valor); break; // Returns the natural logarithm (base e). } return Resp; } }