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");
            }
        }