예제 #1
0
 /// <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);
     }
 }
예제 #2
0
        /// <summary>
        /// 添加左括号节点
        /// </summary>
        /// <param name="equationNodeStack"></param>
        private static void addLeftNode(Stack <EquationNode> equationNodeStack)
        {
            EquationNode item = new EquationNode(EquationNodeType.LEFT, '(');

            equationNodeStack.Push(item);
        }
예제 #3
0
        /// <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);
        }
예제 #4
0
 /// <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);
         }
     }
 }