/// <summary> /// 添加数字节点 /// 如果前一个节点是数字,那么将字符拼接到前一个节点值 /// 否则新增一个节点 /// </summary> /// <param name="equationNodeStack"></param> /// <param name="ch"></param> private static void addNumNode(Stack <EquationNode> equationNodeStack, char ch) { if (equationNodeStack.Any()) { EquationNode item = equationNodeStack.Pop(); if (item.type == EquationNodeType.NUM) { item.concat(ch); equationNodeStack.Push(item); } else { equationNodeStack.Push(item); item = new EquationNode(EquationNodeType.NUM, ch); equationNodeStack.Push(item); } } else { EquationNode item = new EquationNode(EquationNodeType.NUM, ch); equationNodeStack.Push(item); } }
/// <summary> /// 添加左括号节点 /// </summary> /// <param name="equationNodeStack"></param> private static void addLeftNode(Stack <EquationNode> equationNodeStack) { EquationNode item = new EquationNode(EquationNodeType.LEFT, '('); equationNodeStack.Push(item); }
/// <summary> /// 添加操作符节点 /// </summary> /// <param name="equationNodeStack"></param> /// <param name="ch"></param> private static void addOperationNode(Stack <EquationNode> equationNodeStack, char ch) { EquationNode item = new EquationNode(EquationNodeType.OPERATION, ch); equationNodeStack.Push(item); }
/// <summary> /// 单个子算式计算 /// 括号内部计算 /// </summary> /// <param name="equationNodeStack"></param> private static void compute(Stack <EquationNode> equationNodeStack) { if (equationNodeStack.Any()) { Stack <EquationNode> equationNodeStack1 = new Stack <EquationNode>(); EquationNode item; //获取子算式 while (equationNodeStack.Any()) { item = equationNodeStack.Pop(); if (item.type == EquationNodeType.LEFT) { break; } equationNodeStack1.Push(item); } //解决第一个数字为负数的情况,前面添加一个0,变成减法 if (equationNodeStack1.Any()) { item = equationNodeStack1.First(); if (item.type == EquationNodeType.OPERATION && string.Equals(item.value, "-")) { item = new EquationNode(EquationNodeType.NUM, '0'); equationNodeStack1.Push(item); } } //处理乘除法运算 Stack <EquationNode> equationNodeStack2 = new Stack <EquationNode>(); while (equationNodeStack1.Any()) { item = equationNodeStack1.Pop(); if (item.type == EquationNodeType.OPERATION) { if (string.Equals(item.value, "*") || string.Equals(item.value, "/")) { EquationNode item1 = equationNodeStack1.Pop(); EquationNode item2 = equationNodeStack2.Pop(); string r1 = operCompute(item2.value, item1.value, item.value); item = new EquationNode(EquationNodeType.NUM, r1); } } equationNodeStack2.Push(item); } while (equationNodeStack2.Count > 1) { //还原栈 while (equationNodeStack2.Any()) { item = equationNodeStack2.Pop(); equationNodeStack1.Push(item); } //运算 while (equationNodeStack1.Any()) { item = equationNodeStack1.Pop(); if (item.type == EquationNodeType.OPERATION) { EquationNode item1 = equationNodeStack1.Pop(); EquationNode item2 = equationNodeStack2.Pop(); string r1 = operCompute(item2.value, item1.value, item.value); item = new EquationNode(EquationNodeType.NUM, r1); } equationNodeStack2.Push(item); } } if (equationNodeStack2.Any()) { item = equationNodeStack2.Pop(); equationNodeStack.Push(item); } } }