using System;
using System.Text;
using System.Collections.Generic;
using System.Linq;
using System.Collections;
public class InFixtoPostFix
{
public static void Main()
{
// your code goes here
string[] inputString = {"5","+","3","*","6","-","4","+","8"};
string[] outputString;
outputString=InFixtoPostFix.infixToPostFix(inputString);
foreach(string token in outputString)
{
Console.WriteLine(token);
}
}
public enum Precedence
{
Prod = 3,Sub = 2, Add = 1
}
/// <summary>
/// converts an infix expression to postfix expression
/// *,+,- in the order of precedence
/// </summary>
/// <param name="inputExpression"></param>
/// <returns></returns>
public static string[] infixToPostFix(string[] inputExpression)
{
Stack<string> opStack;
string[] output;
int i, j;
if (inputExpression == null) return null;
opStack = new Stack<string>();
output = new string[inputExpression.Length];
i=0;
j = 0;
while (i < inputExpression.Length)
{
// check if token is number
if (IsNumber(inputExpression[i]))
{
output[j++] = inputExpression[i++];
}
// check if token is operator
else if(IsOperator(inputExpression[i]))
{
if(opStack.Count() != 0)
{
while (getPrecedence(opStack.Peek().ToString()) >= getPrecedence(inputExpression[i]))
{
output[j++] = opStack.Pop().ToString();
if (opStack.Count() == 0) break;
}
opStack.Push(inputExpression[i++]);
}
else
opStack.Push(inputExpression[i++]);
}
// non-operator return null string
else
{
return null;
}
}
while (opStack.Count() != 0)
{
output[j++] = opStack.Pop().ToString();
}
return output;
}
public static int getPrecedence(string inputString)
{
switch (inputString)
{
case "*":
return (int)Precedence.Prod;
case "-":
return (int)Precedence.Sub;
case "+":
return (int)Precedence.Add;
}
return -1;
}
public static bool IsNumber(string inputString)
{
try
{
Convert.ToInt32(inputString);
return true;
}
catch (System.FormatException ex)
{
Console.WriteLine("Not a Number");
return false;
}
}
public static bool IsOperator(string inputstring)
{
switch(inputstring)
{
case "*": return true;
case "+": return true;
case "-": return true;
}
return false;
}
}