Una forma sencilla y rápida de aprender JAVA, observando y deduciendo cómo se comporta el lenguaje a través de ejemplos prácticos.

Archivo del blog

martes, 25 de septiembre de 2012

Evaluar expresión Postfija usando pilas.

Codigo:

// Evaluar expresión en notación Postfija (solo num enteros)
package evalpost;

import java.util.Stack;

public class EvalPost {
  public static void main(String[] args) {  
   
    //Entrada (Expresión en Postfija)
    String expr = "2 23 6 + * 1 -"; // equivale a 2*(23+6)-1
    String[] post = expr.split(" ");   
   
    //Declaración de las pilas
    Stack < String > E = new Stack < String > (); //Pila entrada
    Stack < String > P = new Stack < String > (); //Pila de operandos

    //Añadir post (array) a la Pila de entrada (E)
    for (int i = post.length - 1; i >= 0; i--) {
      E.push(post[i]);
    }

    //Algoritmo de Evaluación Postfija
    String operadores = "+-*/%";
    while (!E.isEmpty()) {
      if (operadores.contains("" + E.peek())) {
        P.push(evaluar(E.pop(), P.pop(), P.pop()) + "");
      }else {
        P.push(E.pop());
      }
    }

    //Mostrar resultados:
    System.out.println("Expresion: " + expr);
    System.out.println("Resultado: " + P.peek());

  }

  private static int evaluar(String op, String n2, String n1) {
    int num1 = Integer.parseInt(n1);
    int num2 = Integer.parseInt(n2);
    if (op.equals("+")) return (num1 + num2);
    if (op.equals("-")) return (num1 - num2);
    if (op.equals("*")) return (num1 * num2);
    if (op.equals("/")) return (num1 / num2);
    if (op.equals("%")) return (num1 % num2);
    return 0;
  }

}


Resultado:

run:
Expresion: 2 23 6 + * 1 -
Resultado: 57
BUILD SUCCESSFUL (total time: 0 seconds)

.

32 comentarios:

  1. el codigo marca error en linea: P.push(evaluar(E.pop(), P.pop(), P.pop()) + "");

    me podrian decir porque

    ResponderEliminar
    Respuestas
    1. Habia un error en la declaración de las pilas (ya corregido).

      //Declaración de las pilas
      Stack < String > E = new Stack < String > (); //Pila entrada
      Stack < String > P = new Stack < String > (); //Pila de operandos

      Un saludo,

      Eliminar
  2. y como se evalua una expresion que no este declarada, que se tenga que introducir??

    ResponderEliminar
    Respuestas
    1. Pues de la siguiente manera:

      //Entrada (Expresión en Postfija)
      Scanner leer = new Scanner(System.in);
      String expr = leer.nextLine();

      Saludos,

      Eliminar
    2. lo hize y me muestra la misma expresion no la evalua ayudaa

      Eliminar
    3. Prueba esto:
      import java.util.Scanner;
      ...
      //Entrada (Expresión en Postfija)
      Scanner leer = new Scanner(System.in);
      String expr = leer.nextLine();
      String[] post = expr.split(" ");

      Eliminar
    4. El programa se queda en "Run" y no pasa nada :(

      Eliminar
    5. Es porque no estas pidiendo ningún dato..
      ↓↓↓↓↓↓↓↓↓↓↓Prueba con esto↓↓↓↓↓↓↓↓↓↓↓↓
      Scanner x = new Scanner(System.in);
      System.out.println("Ingrese dato"); //En esta parte pides la operación que deseas realizar
      String expr = x.nextLine();//Posteriormente el scanner lee los datos ingresados..
      String[] post = expr.split(""); //Y finalmente efectúa la operación..

      Eliminar
  3. ejemplo de conversión infija y postfija utilizando memoria estatica y dinámica con pilas

    ResponderEliminar
  4. Una pregunta como hago para ingresar numeros reales en la cadena

    ResponderEliminar
    Respuestas
    1. Para números reales habria que cambiar el tipo de variables integer (numeros naturales) por double (reales).

      Substituye las siguientes lineas del codigo:
      int num1 = Integer.parseInt(n1);
      int num2 = Integer.parseInt(n2);

      por estas otras:
      double num1 = Double.parseDouble(n1);
      double num2 = Double.parseDouble(n2);

      Eliminar
    2. al momento de realizar esto me lanza el mensaje: incompatibles type en las comparaciones siguientes

      Eliminar
    3. Debes cambiar el tipo de retorno de tu método:

      private static int evaluar(String op, String n2, String n1)
      A
      private static double evaluar(String op, String n2, String n1)

      Eliminar
  5. ¿Qué es lo que contiene la pila P?, ya que estamos haciendo P.pop() y me parece no contiene algo...

    ResponderEliminar
    Respuestas
    1. Contiene los operandos. En este ejemplo contiene 2, 23, 6 y 1.

      Eliminar
  6. me muestra un error en evaluar que necesito crear ese metodo es que estoy pasandolo a metodos

    ResponderEliminar
  7. amigo tienes facebook o correo? necesito tu ayuda, urge por favor

    ResponderEliminar
  8. Escribe una expresión algebraica:
    2*(23+6)-1
    Expresion Infija: (2*(23+6)-1)
    Expresion Postfija: 2 23 6 + * 1 -
    Resultado : 51

    DEBE SALIR 51 no 57 .. les agradecería que me corrijan si esque estoy mal.. aunque no lo creo

    REVISEN XFAVOR..

    ResponderEliminar
    Respuestas
    1. Estas mal encaminada. el resultado de (2*(23+6)-1) es 57. Ya estaba bien.

      Eliminar
  9. que tal bro puedes pasarme tu Facebook o correo para aclarar unas dudas te lo agradecería

    ResponderEliminar
  10. ola y si quisiera meter los datos por teclado como seria?? me urge por favor

    ResponderEliminar
  11. Estas seguro de tu codigo?¡

    5+5(2-8*9(4/8))
    Expresion Infija: (5+5(2-8*9(4/8)))
    Expresion Postfija: 5 5 2 8 9 4 8 / * - +
    Resultado: 5.5

    El verdadero resultado es: -165

    ResponderEliminar
    Respuestas
    1. El código de este articulo da por hecho que la expresión Postfija introducida sea correcta (siempre que utilizemos números enteros). De todas formas tienes razón en que el código de la conversión de infijo a postfijo le falta controlar un número seguido de abertura de parentesis "5(" ya que no es lo mismo poner 5(2+3) que 5*(2+3).

      Eliminar
  12. amigo el programa funciona perfectamente pero yo necesito hacerlo sin la biblioteca de java podrias ayudarme ahi

    ResponderEliminar
  13. amigo para que reconozca la potencia

    ResponderEliminar
  14. Una pregunta ¿como hago para poder resolver igual potencias?

    ResponderEliminar
  15. uno de los errores es que no saca la potenia y si ce la pones te la saca mal

    ResponderEliminar
  16. Te agradezco por tu post me hasido de mucha utilidad.
    Me gustaria saber de que manera podria modificar esta funcion para que el algoritmo tambien me reconozca otras expreciones como Log(), aqrt()?
    Te agreadezco por tu respuesta.

    private static int evaluar(String op, String n2, String n1) {
    int num1 = Integer.parseInt(n1);
    int num2 = Integer.parseInt(n2);
    if (op.equals("+")) return (num1 + num2);
    if (op.equals("-")) return (num1 - num2);
    if (op.equals("*")) return (num1 * num2);
    if (op.equals("/")) return (num1 / num2);
    if (op.equals("%")) return (num1 % num2);
    return 0;
    }

    ResponderEliminar
  17. Excelente me ha servido mucho tu código esta perdido totalmente.

    ResponderEliminar
  18. Hola a todos
    No me funciona con esta expresión
    "4*2-2/4*67^2"

    Alguna ayuda?

    ResponderEliminar
  19. cuando es con flotantes y enteros?

    ResponderEliminar
  20. ¿Donde se declara la variable "evaluar"?, me marca un error, ahí

    ResponderEliminar

Con la tecnología de Blogger.