//----------------------------------------------------------------- static void ProcesarToken(string token, CPila pila) { // ----- Este metodo procesa un token, considerando tres casos: // a) Si token es un operador (+,-,*,/,^) desapila dos // operandos de la pila, efectua la operación y apila el resultado // b) Si token es un operando, simplemente apila en la pila // c) Si token es un blanco, simplemente se ignora if (token.Equals("+") || token.Equals("-") || token.Equals("*") || token.Equals("/") || token.Equals("^")) { // ----- Recuperar Operandos. Notar que el metodo Cima() de la // pila devuelve un object, por tanto es necesario // convertirlo en un float mediante un casting // obtiene operando de la pila float operandoDer = float.Parse(pila.Cima().ToString()); // elimina operando de la pila pila.Desapilar(); // obtiene siguiente operando de la pila float operandoIzq = float.Parse(pila.Cima().ToString()); // elimina operando restante de la pila pila.Desapilar(); // ---- Efectuar operacion y apilar el resultado // Notar que el resultado de cada operación // se debe apilar como un objeto de tipo Float if (token.Equals("+")) { pila.Apilar((float)(operandoIzq + operandoDer)); } else if (token.Equals("-")) { pila.Apilar((float)(operandoIzq - operandoDer)); } else if (token.Equals("*")) { pila.Apilar((float)(operandoIzq * operandoDer)); } else if (token.Equals("/")) { pila.Apilar((float)(operandoIzq / operandoDer)); } else if (token.Equals("^")) { pila.Apilar((float)(Potencia(operandoIzq, operandoDer))); } } else if (!token.Equals(" ")) // ----- token es un operando { pila.Apilar((token)); } }
// -------------------------------------------------------------- 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 string Convertir() { // ---- Declarar objetos CPila pila = new CPila(); StringTokenizer st = new StringTokenizer(Expresion, "+-*/^() ", true); string token; string expresionPosFijo = ""; // ---- Convertir expresión, descomponiendo en tokens if (st.countTokens() > 0) { do { token = st.nextToken(); expresionPosFijo = ProcesarToken(token, pila, expresionPosFijo); } while (st.hasMoreTokens()); } // ----- Desapilar todos los operadores que quedan en la pila while (!pila.EsVacia()) { // ----- Agregar operador a la expresión PosFijo expresionPosFijo = expresionPosFijo + (string)pila.Cima(); // ----- Desapilar operador pila.Desapilar(); } return(expresionPosFijo); }