private string GetExpressionString(Token[] reversedPolishNotation) { StringBuilder result = new StringBuilder(); foreach (var token in reversedPolishNotation) { if (token.Type == TokenType.Number) { result.Append(" " + token.Value + " "); } else if (token.Type == TokenType.Operator) { switch (token.OperatorType) { case OperatorType.Addition: result.Append(" + "); break; case OperatorType.Substraction: result.Append(" - "); break; case OperatorType.Mulitiplication: result.Append(" * "); break; case OperatorType.Partition: result.Append(" / "); break; case OperatorType.UnaryMinus: result.Append(" _ "); break; } } else if (token.Type == TokenType.Function) { switch (token.FunctionType) { case FunctionType.Log: result.Append(" LOG "); break; case FunctionType.Sqrt: result.Append(" SQRT "); break; case FunctionType.Pow: result.Append(" POW "); break; } } } return result.ToString(); }
private double Calculate(Token[] reversedPolishNotation) { Stack<Token> numberStack = new Stack<Token>(); for (int index = 0; index < reversedPolishNotation.Length; index++) { if (reversedPolishNotation[index].Type == TokenType.Number) { numberStack.Push(reversedPolishNotation[index]); } else { if (reversedPolishNotation[index].Type == TokenType.Operator) { List<Token> operands = new List<Token>(); for (int count = 0; count < reversedPolishNotation[index].OperandsCount; count++) { operands.Add(numberStack.Pop()); } numberStack.Push(ExecuteOperation(operands, reversedPolishNotation[index].OperatorType)); } else if (reversedPolishNotation[index].Type == TokenType.Function) { List<Token> operands = new List<Token>(); for (int count = 0; count < reversedPolishNotation[index].OperandsCount; count++) { operands.Add(numberStack.Pop()); } numberStack.Push(ExecuteFunction(operands, reversedPolishNotation[index].FunctionType)); } } } if (numberStack.Count == 1) { return numberStack.Pop().Value; } else { throw new Exception("Invalid expression"); } }