Skip to content

Instantly share code, notes, and snippets.

@rebornix
Created July 16, 2012 03:06
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save rebornix/3120180 to your computer and use it in GitHub Desktop.
Save rebornix/3120180 to your computer and use it in GitHub Desktop.
Convert InFix String to PostFix String
private static string ConvertInFixToPostFix(string inFixExpression)
{
if (inFixExpression == null || inFixExpression.Trim().Length == 0)
return inFixExpression;
inFixExpression = inFixExpression.Replace("(", " ( ");
inFixExpression = inFixExpression.Replace(")", " ) ");
inFixExpression = inFixExpression.ToLower();
string[] tokens = inFixExpression.Split(new string[] { }, StringSplitOptions.RemoveEmptyEntries);
if (tokens.Length == 0 || tokens.Length == 1)
return inFixExpression;
Queue<string> outputQueue = new Queue<string>(tokens.Length);
Stack<string> operatorStack = new Stack<string>();
for (int i = 0; i < tokens.Length; i++)
{
switch (tokens[i])
{
//a simple operator
case "and":
case "or":
while (operatorStack.Count > 0 &&
(operatorStack.Peek() == "and" || operatorStack.Peek() == "or" || operatorStack.Peek() == "not"))
outputQueue.Enqueue(operatorStack.Pop());
operatorStack.Push(tokens[i]);
break;
case "not":
operatorStack.Push(tokens[i]);
break;
case "(":
operatorStack.Push(tokens[i]);
break;
case ")":
while (operatorStack.Count > 0 && operatorStack.Peek() != "(")
outputQueue.Enqueue(operatorStack.Pop());
if (operatorStack.Count == 0)
throw new ArgumentException("Parenthesis mismatch in the expression: " + inFixExpression);
operatorStack.Pop(); //pop "("
break;
//a category
default:
outputQueue.Enqueue(tokens[i]);
break;
}
}
while (operatorStack.Count != 0)
outputQueue.Enqueue(operatorStack.Pop());
string postFixExpression = string.Empty;
foreach (string token in outputQueue)
{
postFixExpression += token + " ";
}
return postFixExpression;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment