/*
Java program to convert infix expression to postfix.
Arpita Korwar
1st October, 2008

Runs on Java 1.6.007

Usage:
> java InfixToPostfix <infix expression>
example:
> java InfixToPostfix a*c+d*e
*/

import java.util.Stack;
import java.util.EmptyStackException;

class InfixToPostfix 
{
	private static boolean isOperator (char c)
	{
		return (c == '+' || c == '-' || c == '*' || c == '/');
	}

	private static boolean isOperand (char c)
	{
		return !isOperator (c);
	}

	private static boolean hasLowerPriority (char op1, char op2)
	{
		return ((op1 == '+' || op1 == '-') && (op2 == '*' || op2 == '/'));
	}

	public static void main(String[] args) 
	{
		Stack<String> operandStack = new Stack<String> ();
		Stack<Character> operatorStack = new Stack<Character> ();

		String infix = args [0];

		for (int i = 0; i < infix.length (); i++)
		{
			if (isOperand (infix.charAt (i)))
			{
				operandStack.push (infix.substring (i, i+1));
			}
			else
			{
				try
				{
					char op = operatorStack.peek ();
					while (!operatorStack.empty () && !hasLowerPriority (op, infix.charAt (i)))
					{
						operatorStack.pop ();
						String second = operandStack.pop ();
						String first = operandStack.pop ();
						operandStack.push (first + second + op);
						op = operatorStack.peek ();
					}					
				}
				catch (EmptyStackException ese)
				{
				}

				operatorStack.push (infix.charAt (i));
			}
		}

		while (! operatorStack.empty ())
		{
			char op = operatorStack.pop ();
			String second = operandStack.pop ();
			String first = operandStack.pop ();
			operandStack.push (first + second + op);
		}

		System.out.println (operandStack.pop ());
	}
}

