コード例 #1
0
 static void PutOprToStk(ref OpStk stk, ref ArrayList posfix, ISimplyOperatable op)
 {
     if (stk.IsEmpty())
     {
         stk.Push(op); return;
     }
     // + () 이렇게 괄호가 뒤에 나올 경우에는 괄호의 우선순위를 최하로 하는 방법이 통용되지 않잖아여
     while (!(stk.IsEmpty()))
     {
         if (op is SOBrk)
         {
             break;
         }
         if ((!(stk.Peek is SCBrk)) && (stk.Peek is SOBrk))
         {
             break;
         }
         if (op.priority <= stk.Peek.priority)
         {
             posfix.Add(stk.Pop());
         }
         else
         {
             break;
         }
     }
     if (op is SCBrk)
     {
         return;
     }
     stk.Push(op);
 }
コード例 #2
0
        //public enum PriorityOfOperator {brkopen = 0, brkclose = 0, sum = 1, subtraction = 1, product = 2, division = 2 }

        //...존나 쓸데없이 구조를 복잡하게 짠 것 같다?

        public static ArrayList ConvertInfixToPosfixTest(String infix)
        {
            OpStk         oprstk = new OpStk();
            ArrayList     posfix = new ArrayList();
            StringBuilder buf1   = new StringBuilder();
            double        buf2   = 0;

            foreach (char c in infix)
            {
                double buf3;
                bool   success = double.TryParse(c.ToString(), out buf3);
                if (success)
                {
                    buf2 = buf2 * 10 + buf3; continue;
                }
                else
                {
                    if (buf2 > 0)
                    {
                        posfix.Add(buf2); buf2 = 0;
                    }


                    foreach (ISimplyOperatable op in lso)
                    {
                        if (c == op.expr)
                        {
                            PutOprToStk(ref oprstk, ref posfix, op);  break;
                        }
                    }

                    /*
                     * switch (c)
                     * {
                     * case ('+'):
                     *  break;
                     * case '-':
                     *  break;
                     * case '*':
                     *  break;
                     * case '/':
                     *  break;
                     * case '(':
                     *  break;
                     * case ')':
                     *  break;
                     * case ((char)(32)):
                     *  break;
                     * default:
                     *  throw new Exception("니 계산기에 이상한 문자 넣었죠 쉬팔롬아");
                     * }
                     */
                }

                /*
                 * try
                 * {
                 *  lnum.Add(double.Parse(c.ToString()));
                 * }
                 * catch(FormatException e)
                 * {
                 *  switch(c)
                 *  {
                 *      case '+':
                 *          break;
                 *      case '-':
                 *          break;
                 *      case '*':
                 *          break;
                 *      case '/':
                 *          break;
                 *      case ((char)(32)):
                 *          break;
                 *      default:
                 *          throw e;
                 *  }
                 * }
                 */
            }
            if (buf2 > 0)
            {
                posfix.Add(buf2);
            }
            while (!(oprstk.IsEmpty()))
            {
                posfix.Add(oprstk.Pop());
            }
            return(posfix);
        }