using System.Collections.Generic;
public class InfixPostfixClient
public static void Main()
public static void Test(string input, string expected)
InfixPostfixManager manager = new InfixPostfixManager(input);
manager.AddOperator('+', 1);
manager.AddOperator('-', 1);
manager.AddOperator('*', 2);
manager.AddOperator('/', 2);
Console.WriteLine("Input: " + input);
Console.WriteLine("Expected: " + expected);
string actual = manager.Calculate();
Console.WriteLine("Actual: " + actual);
Console.WriteLine("Passed? " + (actual == expected).ToString());
public class InfixPostfixManager
public string Input{get;set;}
public Dictionary<char, int> OperatorWeightings {get; private set;}
public void AddOperator(char op, int weight)
if (!Char.IsLetterOrDigit(op))
OperatorWeightings.Add(op, weight);
else throw new ArgumentException("Input character must be a mathmatical operator.", "op");
public string Calculate()
string operators = String.Empty;
string result = String.Empty;
for(int i = 0; i < Input.Length; i++)
if (Char.IsLetterOrDigit(Input[i]))
while(!IsOperatorHigherPresidence(Input[i], operators))
result += PopStringStack(ref operators);
while (operators.Length > 0)
result += PopStringStack(ref operators);
private char PopStringStack(ref string stack)
char poppedChar = stack[stack.Length - 1];
stack = stack.Substring(0, stack.Length - 1);
private bool IsOperatorHigherPresidence(char op, string stack)
if (stack.Length == 0) return true;
char peek = stack[stack.Length - 1];
int peekValue = GetOperatorValue(peek);
int opValue = GetOperatorValue(op);
return opValue > peekValue;
private int GetOperatorValue(char op)
if (!OperatorWeightings.TryGetValue(op, out opValue))
throw new ArgumentException("Input string contains an operator that was not supplied a weighting.");
public InfixPostfixManager(string input)
OperatorWeightings = new Dictionary<char, int>();