private List <PolishNotationToken> ReversePolishNotation(string s) { var result = new List <PolishNotationToken>(); var operatorsStack = new Stack <PolishNotationTokenOperator>(); int i = 0; while (i < s.Length) { if (IsDigit(s[i])) { int d = 0; while (i < s.Length && IsDigit(s[i])) { d = d * 10 + CharToInt(s[i]); i++; } result.Add(new PolishNotationTokenNumber(d)); } else if (s[i] == ' ') { while (i < s.Length && s[i] == ' ') { i++; } } else if (PolishNotationTokenOperator.IsOperator(s[i])) { var newOperator = new PolishNotationTokenOperator(s[i]); while (operatorsStack.Count != 0 && operatorsStack.Peek().OperatorPrecedence >= newOperator.OperatorPrecedence) { result.Add(operatorsStack.Pop()); } operatorsStack.Push(newOperator); i++; } } while (operatorsStack.Count != 0) { result.Add(operatorsStack.Pop()); } return(result); }
private int PerformOperation(int left, int right, PolishNotationTokenOperator op) { switch (op.Operator) { case '+': return(left + right); case '*': return(left * right); case '-': return(left - right); case '/': return(left / right); default: throw new NotImplementedException(); } }