// ======================================================================
// 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;
}
}