/// <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); }
static public QuickCalculator FromString(String s) { try { MiddleExpression m = TurnToMiddle(s); PolishExpression p = TurnToPolish(m); QuickCalculator q = TurnToMachine(p); return(q); } catch { return(null); } }
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); }
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); }