EvaluaPostfija.java



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