Programación General > Java

 infijo a prefijo y posfijo

(1/2) > >>

ooAlvar0oo:
Amigos q tal soy nuevo en este foro. Necesito hacer un programa en java que me pase de notacion infija una ecuacion a prefijo y postfija. He hecho lo que verán abajo, pero el metodo sufijo(postfijo) y prefijo no me imprimen nada. Ayudenme please.


--- Código: Text ---import javax.swing.JOptionPane;    public class Calculadora{    public static int menu(){        String input=JOptionPane.showInputDialog("1.Introducir ecuacion infijan2. Mostrar Prefijon3.Mostrar Sufijon4.Resolver operaciones(mediante pilas)n5.Salir");        int in=Integer.parseInt(input);        return in;    }    public static void main(String[]args){        int x=0;        String []pila_final=new String[20],pila_temporal=new String[20];        String infijo="";        Metodos obj=new Metodos();        while(x!=5){        x=menu();        switch(x){        case 1:infijo=JOptionPane.showInputDialog("Introduce la ecuación");break;        case 2:obj.prefijo(infijo, pila_temporal, pila_final); break;        case 3:obj.sufijo(infijo, pila_temporal, pila_final); break;        case 4:obj.operaciones(infijo); break;        case 5:System.exit(0);break;        }        }    }}    class Metodos{        public void operaciones(String infijo){            char a[]=new char[20];            int b[]=new int[20];            int resultado=0, contador=0;            for(int i=0; i<infijo.length();i++){                switch(infijo.charAt(i)){                    case '+':a[0]=infijo.charAt(i);break;                    case '-':a[0]=infijo.charAt(i);break;                    case '*':a[0]=infijo.charAt(i);break;                    case '/':a[0]=infijo.charAt(i);break;                    default:b[contador]=(infijo.charAt(i));                            contador++;                            break;                }            if(contador==2){            if(a[0]=='+'){                resultado+=((b[contador-1])+(b[contador]));                b[0]=resultado;}            if(a[0]=='-'){                resultado+=((b[0])-(b[1]));                b[0]=resultado;}            if(a[0]=='/'){                resultado+=((b[0])/(b[1]));                b[0]=resultado;}            if(a[0]=='*'){                resultado+=((b[0])*(b[1]));                b[0]=resultado;}            contador=1;}            }            JOptionPane.showMessageDialog(null,resultado);                        }        public void sufijo(String infijo, String [] pila_temporal, String [] pila_final){            infijo+="(";            pila_temporal[infijo.length()+1]+=")";            String cad="";                for(int i=infijo.length()+1;i>-1;i--){                    char temporal=infijo.charAt(i);                        switch(temporal){                            case ')':pila_temporal[i]+=temporal; break;                            case '+':case'-':case'/':case'*':case'^':                                while((Jerarquia(temporal))>=(Jerarquia_ant(infijo,i)));                                        pila_temporal[i]+=temporal;                                break;                            case '(':                                while(pila_temporal[i-1]!=")");                                    pila_final[i]=pila_temporal[i];                                    pila_temporal[i]=null;                                    break;                            default:pila_final[i]+=temporal;                        }                }                for(int j=0;j>infijo.length();j++)                    cad+=pila_final[j];                JOptionPane.showMessageDialog(null,cad,"SUFIJO",JOptionPane.PLAIN_MESSAGE);        }            public void prefijo(String infijo, String [] pila_temporal, String [] pila_final){                    infijo+=")";                    pila_temporal[infijo.length()+1]+="(";                    String cad="";                        for(int i=0;i<infijo.length();i++){                            char temporal=infijo.charAt(i);                                switch(temporal){                                    case '(':pila_temporal[i]+=temporal; break;                                    case '+':case'-':case'/':case'*':case'^':                                        while((Jerarquia(temporal))>=(Jerarquia_sig(infijo,i)));                                                pila_temporal[i]+=temporal;                                        break;                                    case ')':                                        while(pila_temporal[i-1]!=")");                                            pila_final[i]=pila_temporal[i];                                            pila_temporal[i]=null;                                            break;                                    default:pila_final[i]+=temporal;                                }                        }                        for(int j=0;j<infijo.length();j++)                            cad+=pila_final[j];                        JOptionPane.showMessageDialog(null,cad,"PREFIJO",JOptionPane.PLAIN_MESSAGE);                }        public char Jerarquia(char temporal){            if(temporal==')')                temporal=5;            if(temporal=='^')                temporal=4;            if(temporal=='*'||temporal=='/')                temporal=3;            if(temporal=='+'||temporal=='-')                temporal=2;            if(temporal=='(')                temporal=1;            return temporal;        }        public char Jerarquia_ant(String infijo, int i){            char aux=0;            if(infijo.charAt(i-1)==')')                aux=5;            if(infijo.charAt(i-1)=='^')                aux=4;            if(infijo.charAt(i-1)=='*'||infijo.charAt(i-1)=='/')                aux=3;            if(infijo.charAt(i-1)=='+'||infijo.charAt(i-1)=='-')                aux=2;            if(infijo.charAt(i-1)=='(')                aux=1;            return aux;        }        public char Jerarquia_sig(String infijo, int i){            char aux=0;            if(infijo.charAt(i+1)==')')                aux=5;            if(infijo.charAt(i+1)=='^')                aux=4;            if(infijo.charAt(i+1)=='*'||infijo.charAt(i+1)=='/')                aux=3;            if(infijo.charAt(i+1)=='+'||infijo.charAt(i+1)=='-')                aux=2;            if(infijo.charAt(i+1)=='(')                aux=1;            return aux;        }    } 
Y otro con unas mejoras me ha quedado asi


--- Código: Text ---import javax.swing.JOptionPane;public class Infijo2Sufijo {    public static int menu(){        String input=JOptionPane.showInputDialog("1.Introducir ecuacion infijan2. Mostrar Prefijon3.Mostrar Sufijon4.Resolver operaciones(mediante pilas)n5.Salir");        int in=Integer.parseInt(input);        return in;    }    public static void main(String[] args) {        int x=0;        Operaciones obj=new Operaciones();        String infijo="";        while(x!=5){            x=menu();            switch(x){            case 1:infijo = JOptionPane.showInputDialog("Infijo"); break;            case 2:obj.Prefijo(infijo);break;            case 3:obj.Sufijo(infijo); break;            case 4: break;            case 5:System.exit(0); break;            }            }        }   }class Operaciones{    public void Sufijo(String infijo){        infijo+=')';        int longitud= infijo.length();        String result="";        char Pa[] = new char[longitud];        char Pb[] = new char[longitud++];        Pb[longitud++]='(';        for (int i = 0; i < longitud; i++) {            char temporal = infijo.charAt(i);                switch (temporal) {                                case '(':Pa[i++]=(temporal);break;                case '+':case '-':case '^':case '*':case '/':                    while (Jerarquia(temporal) <= Jerarquia(Pb[i-1]))                        Pa[i++]=temporal;                    Pb[i]=(Pb[(i-1)-1]);                    Pb[i++]=temporal;                break;                case ')':                    while (Pb[i-1] != '(')                        Pa[i++]=Pb[i--];                    Pa[i]=(Pb[(i-1)-1]);                    Pb[(i-1)-1]=Pb[i];                break;                default:Pa[i++]=temporal;                 break;                }        }       for(int z=0;z<3;z++)            result+=Pa[z];            System.out.println(result);    }    public static int Jerarquia(char operador) {        int valor = 0;        switch (operador) {            case ')':valor= 5;break;            case '^':valor= 4;break;            case '*':case '/':valor= 3; break;            case '+':case '-':valor= 2;break;            case '(':valor= 1;break;        }        return valor;    }    public void Prefijo(String infijo){        infijo+='(';        int longitud= infijo.length();        String result="";        char Pa[] = new char[longitud];        char Pb[] = new char[longitud+1];        Pb[longitud+1]=')';        for (int i = longitud; i > -1; i--) {            char temporal = infijo.charAt(i);                switch (temporal) {                                case ')':Pa[i]=(temporal);break;                case '+':case '-':case '^':case '*':case '/':                    while (Jerarquia(temporal) >= Jerarquia(Pb[i+1]))                        Pa[i++]=temporal;                        Pb[i]=(Pb[(i+1)+1]);                        Pb[i++]=temporal;                break;                case '(':                    while (Pb[i-1] != ')')                        Pa[i]=Pa[i++];                        Pb[i]=(Pb[(i+1)+1]);                        Pb[i]=Pb[(i+1)+1];                break;                default:Pa[i++]=temporal;                 break;                }        }       for(int z=0;z<3;z++)            result+=Pa[z];            System.out.println(result);    }}  

shadow_rev:
Si no me equivoco, en java no se puede hacer un switch con algo distinto de un número, o sea que no puedes hacer algo como:


--- Código: Text ---// Esto no se puede hacerswitch(variable) {  case '(':    ..........    break;  case '+':    .......    break;} 
Podrías usar un array con los caracteres que necesitas, y haces el switch con el índice del array.

:suerte:

godnhoj:
Soy nuevo en este foro y me da gusto poder ayudar...

Busca en google
¿Cómo evaluar expresiones matemáticas en el computador?

y encontraras información muy util para lo que quieres hacer

Hasta pronto

ooAlvar0oo:
Gracias.. ya luego les subo el codigo que hice. Ah y shadow_rev, el charAt si puede ser usado para caracteres, solo que difiere un poco en los case:


--- Código: Text ---switch(cadena.charAt(0){                  case 'a': //Se ponen las comitas para que funcione;                               break;..............................  
Y cuando es en numeros


--- Código: Text ---         switch(x){       //Si x es un entero           case 1: //Se pone el numero simplemente                      break;          .................  

shadow_rev:
Mmmm, excelente dato me has dado. No contemplaba que se pudiera hacer con charAt().

Lo tendré en cuenta para cuando me toque retomar Java  :good:

Navegación

[0] Índice de Mensajes

[#] Página Siguiente

Ir a la versión completa