Пример #1
0
        private static IList<string> convertir(IList<string> infija, string aux)
        {
            bool neg = false, key = true, valor = false;
            IList<string> postfija = new List<string>();
            Pila pila = new Pila(100);
            int cont = -1;
            foreach (string letra in infija)
            {
                cont++;

                if (aux[0] == '-' && key)
                {
                    neg = true;
                    key = false;

                }
                if (cont == 1 && letra.Equals("-"))
                {
                    neg = true;
                    continue;

                }
                if (!pila.estaVacia() && (pila.elementoTope().Equals("/") || pila.elementoTope().Equals("*")) && letra.Equals("-") && valor == false)
                {
                    neg = true;

                }
                else if (esOperador(letra))
                {
                    if (letra.Equals("*") || letra.Equals("/"))
                    {
                        valor = false;
                    }
                    if (pila.estaVacia())
                    {
                        pila.apilar(letra);
                    }
                    else if (letra.Equals("("))
                    {
                        pila.apilar(letra);
                    }
                    else if (pila.elementoTope().Equals("(") && !letra.Equals(")"))
                    {
                        pila.apilar(letra);
                    }
                    else if (letra.Equals(")"))
                    {
                        while (!pila.elementoTope().Equals("("))
                        {
                            postfija.Add((string)pila.desapilar());
                        }
                        pila.desapilar(); //termina desapilando el "(";, según el algoritmo
                    }
                    else
                    {
                        int pe = prioridadEnExpresion(letra); //prioridad en la expresion
                        int pp = prioridadEnPila((string)pila.elementoTope()); //prioridad en la pila
                        if (pe > pp)
                        {
                            pila.apilar(letra);
                        }
                        else
                        {

                            while (true)
                            {
                                postfija.Add((string)pila.desapilar());
                                if (pila.estaVacia())
                                {
                                    pila.apilar(letra);
                                    break;
                                }
                                if (pila.elementoTope().Equals("("))
                                {
                                    pila.apilar(letra);
                                    break;
                                }
                                if (pe > pp)
                                {
                                    pila.apilar(letra);
                                    break;
                                }
                                pp = prioridadEnPila((string)pila.elementoTope());
                            }
                        }
                    }
                }
                else
                {
                    if (neg)
                    {
                        string temp = "-" + letra;
                        //letra = "-" + letra;
                        postfija.Add(temp);

                    }
                    else
                    {
                        postfija.Add(letra);
                    }
                    neg = false;
                    valor = true;
                }
            }
            while (!pila.estaVacia() && !pila.elementoTope().Equals("("))
            {
                postfija.Add((string)pila.desapilar());
            }
            return postfija;
        }