public static double evaluarPostfija(IList<string> postfija) { //en principio se hace sin parentesis, despues de probarlo se meten las condiciones d elos parentesis Pila pila = new Pila(5); string aux = ""; foreach (string letra in postfija) { if (!esOperador(letra)) { if (!letra.Contains("-")) { double num = double.Parse(letra); pila.apilar(num); } else { //en el caso de que haya un / o * seguido de un - aux = letra.Substring(1, letra.Length - 1); double num = -double.Parse(aux); pila.apilar(num); } } else { double num2 = (double)pila.desapilar(); // //primero se desapila el numero 2 double num1 = 0f; //el siguiente try-catch resuelve un gran problema como las siguientes expresiones //(-7) -(-7) (-(-(-(-7-2)))) try { num1 = (double)pila.desapilar(); } catch (Exception) { num1 = 0; } double num3 = operacion(letra, num1, num2); pila.apilar(num3); } } return (double)pila.elementoTope(); }
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; }