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); }
//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); }