示例#1
0
        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);
        }
示例#2
0
        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());
        }