private static Queue <ICleanerNode> Shant(string exp) { Queue <ICleanerNode> q = new Queue <ICleanerNode>(); Stack <ICleanerNode> s = new Stack <ICleanerNode>(); CleanerOperatorNode checker = new CleanerOperatorNode('('); StringBuilder sb = new StringBuilder(); for (int i = 0; i < exp.Length; i++) { if (Splitters.Contains(exp[i])) { if (sb.Length > 0) { q.Enqueue(CreateNode(sb.ToString())); } switch (exp[i]) { case '(': s.Push(new CleanerOperatorNode('(')); break; case ')': while (s.Count > 0 && !checker.IsEqual(s.Peek())) { q.Enqueue(s.Pop()); } if (s.Count > 0) { s.Pop(); } break; default: byte ov = GetOV(exp[i]); while (s.Count > 0 && !checker.IsEqual(s.Peek()) && GetOV(s.Peek()) >= ov) { q.Enqueue(s.Pop()); } s.Push(new CleanerOperatorNode(exp[i])); break; } sb.Clear(); continue; } sb.Append(exp[i]); } if (sb.Length != 0) { q.Enqueue(CreateNode(sb.ToString())); } while (s.Count > 0) { q.Enqueue(s.Pop()); } return(q); }
public static string Clean(string exp) { Queue <ICleanerNode> q = Shant(exp); Stack <ICleanerNode> s = new Stack <ICleanerNode>(); while (q.Count > 0) { ICleanerNode node = q.Dequeue(); if (node.GetType() == typeof(CleanerOperatorNode)) { CleanerOperatorNode operatorNode = (CleanerOperatorNode)node; IComputableCleanerNode n1 = s.Count > 0 ? (IComputableCleanerNode)s.Pop() : null; IComputableCleanerNode n2 = s.Count > 0 ? (IComputableCleanerNode)s.Pop() : null; ICleanerNode n = operatorNode.Execute(n2, n1); s.Push(n); } else { s.Push(node); } } return(s.Pop().ToString()); }