/// <summary> /// 树值计算 /// </summary> /// <param name="root">要计算的节点</param> /// <returns>节点计算结果值</returns> private double Calculator(ExpressionNode root) { double result = default(double); double leftValue = default(double); double rightValue = default(double); if (root == null) { return(result); } if (root.Left != null) { if (!root.Left.IsLeaf) { leftValue = Calculator(root.Left); } else { leftValue = root.Left.Value; } } if (root.Right != null) { if (!root.Right.IsLeaf) { rightValue = Calculator(root.Right); } else { rightValue = root.Right.Value; } } if (!BaseCalate.IsOperator(root.Operator)) { result = root.Value; } else { result = BaseCalate.BaseCal(leftValue, rightValue, root.Operator.ToString()); } return(result); }
/// <summary> /// 无括号的加减乘除混合表达式运算 /// </summary> /// <param name="expression">要计算的表达式字符串</param> /// <returns>表达式节点树</returns> private ExpressionNode BlendExpressionParse(string expression) { int startSubExpressionIndex = 0; int endSubExpressionIndex = -1; string subExpression = string.Empty; double subExpressionValue = 0.0d; if (expression[0] == Operators.Subtraction) { expression = "0" + expression; } while (true) { for (int i = 0; i < expression.Length; i++) { if (expression[i] == Operators.Multiply || expression[i] == Operators.Division) { if (i + 1 == expression.Length) { endSubExpressionIndex = i + 1; } else { for (int j = i + 1; j < expression.Length; j++) { if (BaseCalate.IsOperator(expression[j])) { endSubExpressionIndex = j; break;; } } if (endSubExpressionIndex == -1) { endSubExpressionIndex = expression.Length; } } subExpression = expression.Substring(startSubExpressionIndex, endSubExpressionIndex - startSubExpressionIndex); subExpressionValue = BaseCalate.BaseCal(subExpression); expression = expression.Remove(startSubExpressionIndex, endSubExpressionIndex - startSubExpressionIndex); expression = expression.Insert(startSubExpressionIndex, subExpressionValue.ToString()); endSubExpressionIndex = -1; break; } if (expression[i] == Operators.Add || expression[i] == Operators.Subtraction) { startSubExpressionIndex = i + 1; } } if (!expression.Contains(Operators.Multiply) && !expression.Contains(Operators.Division)) { break; } } ExpressionNode root = BaseExpressionParse(expression); return(root); }