import java.util.Scanner;
import java.util.StringTokenizer;

public class Expressions
{
  public static double RPNEvaluate(Queue<String> input) throws LLException
  {
    Stack<Double> values = new Stack<Double>();
    double val = 0.0;
    boolean isValue;
    double lhs;
    double rhs;

    while(!input.isEmpty())
    {
      String nextToken = input.dequeue();
      try
      {
        val = Double.parseDouble(nextToken);
        isValue = true;
      }
      catch (NumberFormatException e)
      {
        isValue = false;
      }
      if(isValue)
      {
        values.push(val);
      }
      else
      { 
        try
        {
          rhs = values.pop();
          lhs = values.pop();
        }
        catch (LLException e)
        {
          throw new MalformedExpressionException("Expression error");
        }
        if(nextToken.equals("+"))   
        {
          values.push(lhs + rhs);
        }
        else if(nextToken.equals("-"))
        {
          values.push(lhs - rhs);
        }
        else if(nextToken.equals("/"))
        {
          if(rhs == 0.0)
          {
            throw new MalformedExpressionException("Zero divide");
          }
          values.push(lhs / rhs);
        }
        else if(nextToken.equals("*"))
        {
          values.push(lhs * rhs);
        }
        else
        {
          throw new MalformedExpressionException("Illegal character " + nextToken);
        }
      }
    }
    double retval = values.pop();
    if(!values.isEmpty())
      throw new MalformedExpressionException("Unprocessed values");
    return retval;
  } 

  public static void main(String args[]) throws LLException
  {
    Scanner kb = new Scanner(System.in);
    String line;
    boolean done = false;
    Queue<String> q = new Queue<String>();

    while(!done)
    {                
      System.out.print("Enter a postfix expression:");
      line = kb.nextLine();
      if(line.length() == 0)
      {
        done = false;
        break;
      }
      StringTokenizer st = new StringTokenizer(line, "+-/* ", true);
      while(st.hasMoreTokens())
      {
        String token = st.nextToken();
        if(!token.equals(" "))
        {
          q.enqueue(token);
        }
      }
      double result = RPNEvaluate(q);
      System.out.println(result);
    }
  }
} 
        
