// -------------------------------------------------------------- static string ProcesarToken(string token, CPila pila, string expresionPosFijo) { // ----- Si token = ")" desapilar todos los operadores hasta encontrar "(" if (token.Equals(")")) { while ((!pila.EsVacia()) && (!((string)pila.Cima()).Equals("("))) { expresionPosFijo = expresionPosFijo + (string)pila.Cima(); // ---- Desapilar operador pila.Desapilar(); } // ---- Quitar de la pila el ")" if (!pila.EsVacia()) { pila.Desapilar(); } } else if (token.Equals("+") || token.Equals("-") || token.Equals("*") || token.Equals("/") || token.Equals("^")) { // ---- Desapilar operadores, si existen de acuerdo a us precedencia while ((!pila.EsVacia()) && OkProcedencia(token, (string)pila.Cima())) { // ---- Agregar operador a la expresion PosFijo expresionPosFijo = expresionPosFijo + (string)pila.Cima(); // ---- Desapilar operador pila.Desapilar(); } // ---- Apilar nuevo operador pila.Apilar(token); } else // ---- Si es "(" apilar if (token.Equals("(")) { pila.Apilar(token); } else // ---- Si no es " " agregar token a expreseionPosFijo, caso // contrario ignorar token. if (!token.Equals(" ")) { expresionPosFijo = expresionPosFijo + " " + token; } // ---- Retornar valor de expresión posFijo return(expresionPosFijo); }
//----------------------------------------------------------------- public float Evaluar(string expresion) { // ----- Declarar objetos CPila pila; StringTokenizer st; string token; // ----- Crear un objeto pila pila = new CPila(); // ----- Crear un objeto StringTokenizer st = new StringTokenizer(expresion, "+-*/^ ", true); // ----- Evaluar expresión, descomponiendo en tokens if (st.countTokens() > 0) { do { token = st.nextToken(); ProcesarToken(token, pila); } while (st.hasMoreTokens()); } // ----- Obtener el resultado de la pila return((float)pila.Cima()); }
public void Apilar(object pElemento) { SubPila = new CPila(Elemento, SubPila); Elemento = pElemento; }