/// <summary>
        /// 将字符串解析为中序表达式
        /// </summary>
        /// <param name="str">要解析的字符串</param>
        /// <returns>一个中序表达式结构体</returns>
        static public MiddleExpression TurnToMiddle(string str)
        {
            string           s        = str.Replace(" ", "");
            MiddleExpression m        = new MiddleExpression();
            CalcNode         LastNode = new CalcNode(NodeType.Num);

            char[] cs = s.ToCharArray();
            LastNode = null;
            foreach (char c in cs)
            {
                if (c >= 48 && c <= 57)
                {
                    if (LastNode != null && LastNode.Type == NodeType.Num)
                    {
                        LastNode.Num = LastNode.Num * 10 + c - 48;
                    }
                    else
                    {
                        LastNode = CalcNode.FromDouble(c - 48.0);
                        m.Add(LastNode);
                    }
                }
                else if (Operators.Contains(c))
                {
                    LastNode = CalcNode.FromChar(c);
                    m.Add(LastNode);
                }
                else
                {
                    if (LastNode != null && LastNode.Type == NodeType.Variable)
                    {
                        LastNode.Value += c;
                    }
                    else
                    {
                        LastNode       = new CalcNode(NodeType.Variable);
                        LastNode.Value = c.ToString();
                        m.Add(LastNode);
                    }
                }
            }
            // 检查是否有计算节点是函数
            foreach (CalcNode node in m)
            {
                if (node.Type == NodeType.Variable)
                {
                    if (Functions.Contains(node.Value))
                    {
                        node.Type = NodeType.Function;
                    }
                }
            }
            return(m);
        }
Beispiel #2
0
 static public QuickCalculator FromString(String s)
 {
     try
     {
         MiddleExpression m = TurnToMiddle(s);
         PolishExpression p = TurnToPolish(m);
         QuickCalculator  q = TurnToMachine(p);
         return(q);
     }
     catch
     {
         return(null);
     }
 }
Beispiel #3
0
        static public MiddleExpression TurnToMiddle(string str)
        {
            string           s        = str.Replace(" ", "");
            MiddleExpression m        = new MiddleExpression();
            CalcNode         LastNode = new CalcNode(NodeType.Num);

            char[] cs = s.ToCharArray();
            LastNode = null;
            foreach (char c in cs)
            {
                if (c >= 48 && c <= 57)
                {
                    if (LastNode != null && LastNode.Type == NodeType.Num)
                    {
                        LastNode.Num = LastNode.Num * 10 + c - 48;
                    }
                    else
                    {
                        LastNode = CalcNode.FromDouble(c - 48.0);
                        m.Add(LastNode);
                    }
                }
                else if (c == '+' || c == '-' || c == '*' || c == '/' || c == '%' || c == '^' || c == '(' || c == ')')
                {
                    LastNode = CalcNode.FromChar(c);
                    m.Add(LastNode);
                }
                else
                {
                    LastNode       = new CalcNode(NodeType.Variable);
                    LastNode.Value = c;
                    m.Add(LastNode);
                }
            }
            return(m);
        }
Beispiel #4
0
        static public PolishExpression TurnToPolish(MiddleExpression f)
        {
            Stack <CalcNode> S1 = new Stack <CalcNode>();
            Stack <CalcNode> S2 = new Stack <CalcNode>();

            S1.Push(new CalcNode(NodeType.Operator));
            PolishExpression e = new PolishExpression();

            foreach (CalcNode node in f)
            {
                if (node.Type == NodeType.Operator)
                {
                    if (node.Value == '(')
                    {
                        S1.Push(node);
                    }
                    else if (node.Value == ')')
                    {
                        CalcNode LastNode = S1.Pop();
                        while (LastNode.Value != '(')
                        {
                            S2.Push(LastNode);
                            LastNode = S1.Pop();
                        }
                    }
                    else
                    {
                        if (S1.Peek().Value == '(')
                        {
                            S1.Push(node);
                        }
                        else
                        {
                            int rank    = Rank(node.Value);
                            int Toprank = Rank(S1.Peek().Value);
                            if (rank <= Toprank)
                            {
                                while (!(S2.Peek().Value == '(' || Rank(S1.Peek().Value) < rank))
                                {
                                    S2.Push(S1.Pop());
                                }
                            }
                            S1.Push(node);
                        }
                    }
                }
                else
                {
                    S2.Push(node);
                }
            }
            if (S1.Count != 0)
            {
                while (S1.Count > 1)
                {
                    S2.Push(S1.Pop());
                }
            }
            PolishExpression p = new PolishExpression();

            while (S2.Count > 0)
            {
                p.Push(S2.Pop());
            }
            return(p);
        }