26022321-Convertir-de-Infijo-a-Posfijo

download 26022321-Convertir-de-Infijo-a-Posfijo

of 10

Transcript of 26022321-Convertir-de-Infijo-a-Posfijo

  • 8/7/2019 26022321-Convertir-de-Infijo-a-Posfijo

    1/10

    Una manera de perder el tiempo

    Infijo a Posfijo

    leave a comment

    Bueno, ya despus del programa de pilas que puse hace poco (es el articulo pasado), sigue lo pasar una expresin infija a posfija (luego pongo la de posfija a infija) que tambin se hacemediante pilas, pero en esta se hace manualmente (es decir, lpiz y papel). Aqu estn los paso(algoritmo) que hay que seguir:

    ALGORITMO: POLACA(Q,P). Suponemos que Q es una expresin aritmtica escrita ennotacin infija. Este algoritmo encuentra su expresin postfija P.

    1.- Meter ( en PILA y aadir ) al final de Q.2.- Examinar Q de izquierda a derecha y repetir los pasos 3 a 6 para cada elemento de Q hastaque la PILA est vaca.3.- Si se encuentra PARNTESIS IZQ., meterlo en PILA.4.- Si se encuentra un OPERADOR entonces:(a) Repetidamente sacar de PILA y aadir a P cada operador (de la cima de PILA) que tenga lmisma precedencia o mayor que el operador.(b) Aadir OPERADOR a PILA.[FIN de condicional]5.- Si se encuentra un PARNTESIS DER., entonces:(a) Repetidamente sacar de PILA y aadir a P cada operador (de la cima de PILA) hasta que sencuentre un parntesis izquierdo.(b) Eliminar el PARNTESIS IZQ.(no aadir el parntesis izquierdo a P).[Fin de condicional]6.- Si se encuentra un OPERANDO, aadirlo a P.

    [Fin del Bucle]7.- Salir.

    Los operadores siguen la siguiente jerarqua (El de arriba es el que tiene mayor jerarqua hastabajo el que tiene la menor):^* /+ -(

    Ejemplo:

    http://linkcode.wordpress.com/2008/04/14/infijo-a-posfijo/http://linkcode.wordpress.com/2008/04/14/infijo-a-posfijo/#commentshttp://linkcode.wordpress.com/2008/04/14/infijo-a-posfijo/#commentshttp://linkcode.wordpress.com/2008/04/14/infijo-a-posfijo/
  • 8/7/2019 26022321-Convertir-de-Infijo-a-Posfijo

    2/10

    A+(X/Y)*B^C

    Este es un ejemplo demasiado sencillo, pero explica los pasos a seguir, y como se puede ver eultima fila de la tabla esta el resultado.

    class converpostultima {

    public static void main (String args[])

    {

    String expr = new String("");

    String exprpost = new String("");

    char ch;

    int max;

    System.out.print("Dame la Expresion en Infijo: ");

    expr =Leer.dato();

    max=expr.length();

    operapilaschar obj1 = new operapilaschar(max);

    System.out.println();System.out.println();

    System.out.println("La Expresion en Postfijo es :");

    obj1.push('('); // inserta '(' a la PILA

    expr+=')'; // inserta ')' al final de Q

    http://linkcode.files.wordpress.com/2008/04/cuadro.png
  • 8/7/2019 26022321-Convertir-de-Infijo-a-Posfijo

    3/10

    for (int i=0;i=precedencia(ch) && obj1.pila[obj1.tope]!='('))

    {

    obj1.pop();

    exprpost+=obj1.dret;

    }

    obj1.push(ch);

    break;

    case ')': while (obj1.pila[obj1.tope] != '(')

    {

    obj1.pop();exprpost+=obj1.dret;

    }

    obj1.pop();

    break;

    default : exprpost+=ch;

    }

    }

    while (!(obj1.pila_Vacia(obj1.tope)))

    {

    obj1.pop();

    if (obj1.dret!= '(')

    exprpost+=obj1.dret;

    }

    System.out.println(exprpost);

    }

  • 8/7/2019 26022321-Convertir-de-Infijo-a-Posfijo

    4/10

    public static int precedencia(char ch)

    {

    int aux = 0;

    switch (ch)

    {

    case '^' : aux = 4;

    break;

    case '*' : case '/' : aux = 3;

    break;case '+' : case '-' : aux = 2;

    break;

    case '(' : aux = 1;

    break;

    }

    return aux;

    }

    }

    class operapilaschar

    {

  • 8/7/2019 26022321-Convertir-de-Infijo-a-Posfijo

    5/10

    public static char dret;

    public static int max;

    public static char pila[];

    public static int tope = -1;

    public operapilaschar()

    {

    max=20;

    pila=new char [max];

    }

    public operapilaschar(int n)

    {

    max=n-1;

    pila = new char [max];

  • 8/7/2019 26022321-Convertir-de-Infijo-a-Posfijo

    6/10

    }

    public static boolean pila_Llena(int tope,int max)

    {

    boolean llena;

    if (tope==max)

    llena=true;

    else

    llena=false;

    return llena;

    }

    public static boolean pila_Vacia(int tope)

    {

    boolean vacia;

  • 8/7/2019 26022321-Convertir-de-Infijo-a-Posfijo

    7/10

    if (tope == -1)

    vacia=true;

    else

    vacia=false;

    return vacia;

    }

    public static void push(char dato)

    {

    if(pila_Llena(tope,max))

    System.out.println("!Cuidado!, Desbordamiento!!!!!");

    else

    {

    tope++;

  • 8/7/2019 26022321-Convertir-de-Infijo-a-Posfijo

    8/10

    pila[tope]=dato;// pone el nuevo dato en la pila

    }

    }

    public static void pop()

    {

    if (pila_Vacia(tope))

    System.out.println("!Cuidado!, Subdesbordamiento!!!!!");

    else {

    dret=pila[tope];

    tope--;

    }// actualiza tope y se elimina elemento en el tope

    }

    public static boolean compara(int dret,int ch)

  • 8/7/2019 26022321-Convertir-de-Infijo-a-Posfijo

    9/10

    {

    if (dret=='(' && ch==')' || dret=='{' && ch=='}' ||dret=='[' && ch==']')

    return true;

    else

    return false;

    }

    public static void estado()

    {

    int i;

    System.out.println(" El estado de la pila es : ");

    System.out.println(" --------------------------");

    for(i=0;i