Notacion Polaca

enum Simbolo { OPERANDO, PIZQ, PDER, SUMRES, MULTDIV, POW };
        class NotacionPolaca
    {
        public StringBuilder Convertir_a_posfija(string EI)
        {
            char[] Epos = new char[EI.Length];
            int tam = EI.Length;
            Pila<int> stack = new Pila<int>(EI.Length);
            int i, pos = 0;
            for (i = 0; i < Epos.Length; i++)
            {
                char car = EI[i];
                Simbolo actual = Tipo_y_Precedencia(car);
                switch (actual)
                {
                    case Simbolo.OPERANDO: Epos[pos++] = car; break;
                    case Simbolo.SUMRES:
                        {

                while (!stack.EstaVacia && Tipo_y_Precedencia((char)stack.Tope) >= actual)
                                Epos[pos++] = (char)stack.Pop();
                            stack.Push(car);
                        }
                        break;
                    case Simbolo.MULTDIV:
                        {

            while (!stack.EstaVacia && Tipo_y_Precedencia((char)stack.Tope) >= actual)
                                Epos[pos++] = (char)stack.Pop();
                            stack.Push(car);
                        }
                        break;
                    case Simbolo.POW:
                        {
          while (!stack.EstaVacia && Tipo_y_Precedencia((char)stack.Tope) >= actual)

                                Epos[pos++] = (char)stack.Pop();
                            stack.Push(car);

                        }
                        break;
                    case Simbolo.PDER: char x = (char)stack.Pop();
                        while (Tipo_y_Precedencia(x) != Simbolo.PIZQ)
                        {
                            Epos[pos++] = x;
                            x = (char)stack.Pop();
                        }
                        break;
                    case Simbolo.PIZQ: stack.Push(car); break;
                                  
                   
                }
            }

                while (!stack.EstaVacia)
                {
                    if (pos < Epos.Length)
                        Epos[pos++] = (char)stack.Pop();
                    else
                        break;
                }
                StringBuilder regresa = new StringBuilder(EI);

                for (int B = 0; B < Epos.Length; B++)
                    regresa[B] = Epos[B];
                return regresa;

            }
        public Simbolo Tipo_y_Precedencia(char n)
        {
            Simbolo simbolo;

            switch (n)
            {

                case '+': simbolo = Simbolo.SUMRES; break;
                case '-': simbolo = Simbolo.SUMRES; break;
                case '*': simbolo = Simbolo.MULTDIV; break;
                case '/': simbolo = Simbolo.MULTDIV; break;
                case '^': simbolo = Simbolo.POW; break;
                case '(': simbolo = Simbolo.PIZQ; break;
                case ')': simbolo = Simbolo.PDER; break;
                default: simbolo = Simbolo.OPERANDO; break;
            }
            return simbolo;
        }
             public static bool ExpresionPostfija(string r, ref int res)
        {
            Pila<int> p =new Pila<int>(r.Length);
            int op1 = 0, op2 = 0;
            for (int i = 0; i < r.Length; i++)
if (!(r[i] == '+' || r[i] == '-' || r[i] == '*' || r[i] == '/' ||r[i]=='^'|| r[i] >= '0' && r[i] <= '9'))
                    return false;
                if (r[i] == '+' || r[i] == '-' || r[i] == '*' || r[i] == '/' || r[i] == '^')
                {
                    if (p.Pop(ref op2) && p.Pop(ref op1))
                        p.Push(Res(r[i], op1, op2));
                    else
                        return false;
                }
                if (r[i] >= '0' && r[i] <= '9')
                {
                    p.Push(Convert.ToInt32(r[i].ToString()));
                }


            }
            p.Pop(ref res);
            return true;
        }
        public static int Res(char op,int op1, int op2)
        {
            switch (op)
            {
                case '+':
                    return op1 + op2;
                case '-':
                    return op1 - op2;
                case '*':
                    return op1 * op2;
                case '/':
                    return op1 / op2;
                case '^':
                    return Convert.ToInt32(Math.Pow(op1, op2));
             
            }
            return 0;
        }
    }
}