• Viernes 8 de Noviembre de 2024, 12:40

Autor Tema:  infijo a prefijo y posfijo  (Leído 31024 veces)

ooAlvar0oo

  • Nuevo Miembro
  • *
  • Mensajes: 4
    • Ver Perfil
infijo a prefijo y posfijo
« en: Domingo 21 de Septiembre de 2008, 21:31 »
0
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
  1. import javax.swing.JOptionPane;
  2.     public class Calculadora{
  3.     public static int menu(){
  4.         String input=JOptionPane.showInputDialog("1.Introducir ecuacion infijan2. Mostrar Prefijon3.Mostrar Sufijon4.Resolver operaciones(mediante pilas)n5.Salir");
  5.         int in=Integer.parseInt(input);
  6.         return in;
  7.     }
  8.     public static void main(String[]args){
  9.         int x=0;
  10.         String []pila_final=new String[20],pila_temporal=new String[20];
  11.         String infijo="";
  12.         Metodos obj=new Metodos();
  13.         while(x!=5){
  14.         x=menu();
  15.         switch(x){
  16.         case 1:infijo=JOptionPane.showInputDialog("Introduce la ecuación");break;
  17.         case 2:obj.prefijo(infijo, pila_temporal, pila_final); break;
  18.         case 3:obj.sufijo(infijo, pila_temporal, pila_final); break;
  19.         case 4:obj.operaciones(infijo); break;
  20.         case 5:System.exit(0);break;
  21.         }
  22.         }
  23.     }
  24. }
  25.     class Metodos{
  26.         public void operaciones(String infijo){
  27.             char a[]=new char[20];
  28.             int b[]=new int[20];
  29.             int resultado=0, contador=0;
  30.             for(int i=0; i<infijo.length();i++){
  31.                 switch(infijo.charAt(i)){
  32.                     case '+':a[0]=infijo.charAt(i);break;
  33.                     case '-':a[0]=infijo.charAt(i);break;
  34.                     case '*':a[0]=infijo.charAt(i);break;
  35.                     case '/':a[0]=infijo.charAt(i);break;
  36.                     default:b[contador]=(infijo.charAt(i));
  37.                             contador++;
  38.                             break;
  39.                 }
  40.             if(contador==2){
  41.             if(a[0]=='+'){
  42.                 resultado+=((b[contador-1])+(b[contador]));
  43.                 b[0]=resultado;}
  44.             if(a[0]=='-'){
  45.                 resultado+=((b[0])-(b[1]));
  46.                 b[0]=resultado;}
  47.             if(a[0]=='/'){
  48.                 resultado+=((b[0])/(b[1]));
  49.                 b[0]=resultado;}
  50.             if(a[0]=='*'){
  51.                 resultado+=((b[0])*(b[1]));
  52.                 b[0]=resultado;}
  53.             contador=1;}
  54.             }
  55.             JOptionPane.showMessageDialog(null,resultado);
  56.                
  57.         }
  58.         public void sufijo(String infijo, String [] pila_temporal, String [] pila_final){
  59.             infijo+="(";
  60.             pila_temporal[infijo.length()+1]+=")";
  61.             String cad="";
  62.                 for(int i=infijo.length()+1;i>-1;i--){
  63.                     char temporal=infijo.charAt(i);
  64.                         switch(temporal){
  65.                             case ')':pila_temporal[i]+=temporal; break;
  66.                             case '+':case'-':case'/':case'*':case'^':
  67.                                 while((Jerarquia(temporal))>=(Jerarquia_ant(infijo,i)));
  68.                                         pila_temporal[i]+=temporal;
  69.                                 break;
  70.                             case '(':
  71.                                 while(pila_temporal[i-1]!=")");
  72.                                     pila_final[i]=pila_temporal[i];
  73.                                     pila_temporal[i]=null;
  74.                                     break;
  75.                             default:pila_final[i]+=temporal;
  76.                         }
  77.                 }
  78.                 for(int j=0;j>infijo.length();j++)
  79.                     cad+=pila_final[j];
  80.                 JOptionPane.showMessageDialog(null,cad,"SUFIJO",JOptionPane.PLAIN_MESSAGE);
  81.         }
  82.             public void prefijo(String infijo, String [] pila_temporal, String [] pila_final){
  83.                     infijo+=")";
  84.                     pila_temporal[infijo.length()+1]+="(";
  85.                     String cad="";
  86.                         for(int i=0;i<infijo.length();i++){
  87.                             char temporal=infijo.charAt(i);
  88.                                 switch(temporal){
  89.                                     case '(':pila_temporal[i]+=temporal; break;
  90.                                     case '+':case'-':case'/':case'*':case'^':
  91.                                         while((Jerarquia(temporal))>=(Jerarquia_sig(infijo,i)));
  92.                                                 pila_temporal[i]+=temporal;
  93.                                         break;
  94.                                     case ')':
  95.                                         while(pila_temporal[i-1]!=")");
  96.                                             pila_final[i]=pila_temporal[i];
  97.                                             pila_temporal[i]=null;
  98.                                             break;
  99.                                     default:pila_final[i]+=temporal;
  100.                                 }
  101.                         }
  102.                         for(int j=0;j<infijo.length();j++)
  103.                             cad+=pila_final[j];
  104.                         JOptionPane.showMessageDialog(null,cad,"PREFIJO",JOptionPane.PLAIN_MESSAGE);       
  105.         }
  106.         public char Jerarquia(char temporal){
  107.             if(temporal==')')
  108.                 temporal=5;
  109.             if(temporal=='^')
  110.                 temporal=4;
  111.             if(temporal=='*'||temporal=='/')
  112.                 temporal=3;
  113.             if(temporal=='+'||temporal=='-')
  114.                 temporal=2;
  115.             if(temporal=='(')
  116.                 temporal=1;
  117.             return temporal;
  118.         }
  119.         public char Jerarquia_ant(String infijo, int i){
  120.             char aux=0;
  121.             if(infijo.charAt(i-1)==')')
  122.                 aux=5;
  123.             if(infijo.charAt(i-1)=='^')
  124.                 aux=4;
  125.             if(infijo.charAt(i-1)=='*'||infijo.charAt(i-1)=='/')
  126.                 aux=3;
  127.             if(infijo.charAt(i-1)=='+'||infijo.charAt(i-1)=='-')
  128.                 aux=2;
  129.             if(infijo.charAt(i-1)=='(')
  130.                 aux=1;
  131.             return aux;
  132.         }
  133.         public char Jerarquia_sig(String infijo, int i){
  134.             char aux=0;
  135.             if(infijo.charAt(i+1)==')')
  136.                 aux=5;
  137.             if(infijo.charAt(i+1)=='^')
  138.                 aux=4;
  139.             if(infijo.charAt(i+1)=='*'||infijo.charAt(i+1)=='/')
  140.                 aux=3;
  141.             if(infijo.charAt(i+1)=='+'||infijo.charAt(i+1)=='-')
  142.                 aux=2;
  143.             if(infijo.charAt(i+1)=='(')
  144.                 aux=1;
  145.             return aux;
  146.         }
  147.     }
  148.  

Y otro con unas mejoras me ha quedado asi

Código: Text
  1. import javax.swing.JOptionPane;
  2. public class Infijo2Sufijo {
  3.     public static int menu(){
  4.         String input=JOptionPane.showInputDialog("1.Introducir ecuacion infijan2. Mostrar Prefijon3.Mostrar Sufijon4.Resolver operaciones(mediante pilas)n5.Salir");
  5.         int in=Integer.parseInt(input);
  6.         return in;
  7.     }
  8.     public static void main(String[] args) {
  9.         int x=0;
  10.         Operaciones obj=new Operaciones();
  11.         String infijo="";
  12.         while(x!=5){
  13.             x=menu();
  14.             switch(x){
  15.             case 1:infijo = JOptionPane.showInputDialog("Infijo"); break;
  16.             case 2:obj.Prefijo(infijo);break;
  17.             case 3:obj.Sufijo(infijo); break;
  18.             case 4: break;
  19.             case 5:System.exit(0); break;
  20.             }
  21.             }
  22.         }   
  23. }
  24. class Operaciones{
  25.     public void Sufijo(String infijo){
  26.         infijo+=')';
  27.         int longitud= infijo.length();
  28.         String result="";
  29.         char Pa[] = new char[longitud];
  30.         char Pb[] = new char[longitud++];
  31.         Pb[longitud++]='(';
  32.         for (int i = 0; i < longitud; i++) {
  33.             char temporal = infijo.charAt(i);
  34.                 switch (temporal) {
  35.                
  36.                 case '(':Pa[i++]=(temporal);break;
  37.                 case '+':case '-':case '^':case '*':case '/':
  38.                     while (Jerarquia(temporal) <= Jerarquia(Pb[i-1]))
  39.                         Pa[i++]=temporal;
  40.                     Pb[i]=(Pb[(i-1)-1]);
  41.                     Pb[i++]=temporal;
  42.                 break;
  43.                 case ')':
  44.                     while (Pb[i-1] != '(')
  45.                         Pa[i++]=Pb[i--];
  46.                     Pa[i]=(Pb[(i-1)-1]);
  47.                     Pb[(i-1)-1]=Pb[i];
  48.                 break;
  49.                 default:Pa[i++]=temporal;
  50.                 break;
  51.                 }
  52.         }
  53.        for(int z=0;z<3;z++)
  54.             result+=Pa[z];
  55.             System.out.println(result);
  56.     }
  57.     public static int Jerarquia(char operador) {
  58.         int valor = 0;
  59.         switch (operador) {
  60.             case ')':valor= 5;break;
  61.             case '^':valor= 4;break;
  62.             case '*':case '/':valor= 3; break;
  63.             case '+':case '-':valor= 2;break;
  64.             case '(':valor= 1;break;
  65.         }
  66.         return valor;
  67.     }
  68.     public void Prefijo(String infijo){
  69.         infijo+='(';
  70.         int longitud= infijo.length();
  71.         String result="";
  72.         char Pa[] = new char[longitud];
  73.         char Pb[] = new char[longitud+1];
  74.         Pb[longitud+1]=')';
  75.         for (int i = longitud; i > -1; i--) {
  76.             char temporal = infijo.charAt(i);
  77.                 switch (temporal) {
  78.                
  79.                 case ')':Pa[i]=(temporal);break;
  80.                 case '+':case '-':case '^':case '*':case '/':
  81.                     while (Jerarquia(temporal) >= Jerarquia(Pb[i+1]))
  82.                         Pa[i++]=temporal;
  83.                         Pb[i]=(Pb[(i+1)+1]);
  84.                         Pb[i++]=temporal;
  85.                 break;
  86.                 case '(':
  87.                     while (Pb[i-1] != ')')
  88.                         Pa[i]=Pa[i++];
  89.                         Pb[i]=(Pb[(i+1)+1]);
  90.                         Pb[i]=Pb[(i+1)+1];
  91.                 break;
  92.                 default:Pa[i++]=temporal;
  93.                 break;
  94.                 }
  95.         }
  96.        for(int z=0;z<3;z++)
  97.             result+=Pa[z];
  98.             System.out.println(result);
  99.     }
  100. }
  101.  
  102.  
« última modificación: Miércoles 9 de Febrero de 2011, 01:30 por ooAlvar0oo »

shadow_rev

  • Miembro MUY activo
  • ***
  • Mensajes: 397
  • Nacionalidad: co
  • Un SPARTAN no muere en combate
    • Ver Perfil
    • http://shadowrev.blogspot.com
Re: Please!!Como Pasar ecuacion de infijo a prefijo y postfijo
« Respuesta #1 en: Lunes 22 de Septiembre de 2008, 19:57 »
0
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
  1. // Esto no se puede hacer
  2. switch(variable) {
  3.   case '(':
  4.     ..........
  5.     break;
  6.   case '+':
  7.     .......
  8.     break;
  9. }
  10.  

Podrías usar un array con los caracteres que necesitas, y haces el switch con el índice del array.

:suerte:
Volará quien le ponga alas a sus sueños (Candidate for goddess)
Si el mal existe en este mundo, reside en el corazón de la humanidad (Edward D. Morrison - Tales of Phantasia)
Lo único que puedes cambiar del pasado, es lo que sientes por él en el presente (Lockon Stratos - Mobile Suit Gundam 00)
Ingeniero de Sistemas

godnhoj

  • Nuevo Miembro
  • *
  • Mensajes: 1
    • Ver Perfil
Re: Please!!Como Pasar ecuacion de infijo a prefijo y postfijo
« Respuesta #2 en: Martes 23 de Septiembre de 2008, 16:44 »
0
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

  • Nuevo Miembro
  • *
  • Mensajes: 4
    • Ver Perfil
Re: Please!!Como Pasar ecuacion de infijo a prefijo y postfijo
« Respuesta #3 en: Martes 23 de Septiembre de 2008, 21:28 »
0
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
  1. switch(cadena.charAt(0){
  2.                   case 'a': //Se ponen las comitas para que funcione;
  3.                                break;
  4. ..............................
  5.  
  6.  

Y cuando es en numeros

Código: Text
  1.  
  2.         switch(x){       //Si x es un entero
  3.            case 1: //Se pone el numero simplemente
  4.                       break;
  5.           .................
  6.  
  7.  

shadow_rev

  • Miembro MUY activo
  • ***
  • Mensajes: 397
  • Nacionalidad: co
  • Un SPARTAN no muere en combate
    • Ver Perfil
    • http://shadowrev.blogspot.com
Re: Please!!Como Pasar ecuacion de infijo a prefijo y postfijo
« Respuesta #4 en: Martes 23 de Septiembre de 2008, 21:38 »
0
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:
Volará quien le ponga alas a sus sueños (Candidate for goddess)
Si el mal existe en este mundo, reside en el corazón de la humanidad (Edward D. Morrison - Tales of Phantasia)
Lo único que puedes cambiar del pasado, es lo que sientes por él en el presente (Lockon Stratos - Mobile Suit Gundam 00)
Ingeniero de Sistemas

ooAlvar0oo

  • Nuevo Miembro
  • *
  • Mensajes: 4
    • Ver Perfil
Re: Please!!Como Pasar ecuacion de infijo a prefijo y postfijo
« Respuesta #5 en: Jueves 25 de Septiembre de 2008, 02:36 »
0
Pues yo estoy aprendiendo

Les dejo como lo hice..... para ver a quien le ayuda.

Código: Text
  1. /*=============================
  2.  *                     
  3.  *      Transforma de infijo a prefijo y posfijo
  4.  *                Solo les dejo les metodos...
  5.  *                    que hice mucho if  
  6.  *=================================*/
  7.  
  8.     static class Operaciones{
  9.         public void Asufijo(String infijo, int longitud){
  10.             char p1[]=new char[longitud], p2[]=new char[longitud];
  11.             int contp1=0, contp2=0;
  12.             String sufijo="";
  13.             for(int i=1;i<longitud;i++){
  14.                 char tmp=infijo.charAt(i);
  15.                 switch(tmp){
  16.                 case '(':
  17.                     if(contp2 <= 0){        //Si p2 está vacío mete operador
  18.                         p2[contp2]=tmp;
  19.                         contp2++;
  20.                     }
  21.                     else{
  22.                         p2[contp2]=tmp;
  23.                         contp2++;
  24.                     }
  25.                     break;
  26.                 case '^':
  27.                     if(contp2 <= 0){        //Si p2 está vacío mete operador
  28.                         p2[contp2]=tmp;
  29.                         contp2++;
  30.                     }
  31.                     else{
  32.                         if(p2[contp2-1]=='^'){
  33.                             for(int j=contp2; j>0; j--){    //Paso a p1
  34.                             if(p2[contp2-1]=='(')   
  35.                                 contp2=j-1;
  36.                             else{
  37.                                 p1[contp1]=p2[j-1];
  38.                                 contp1++;
  39.                             }
  40.                         }
  41.                         contp2++;
  42.                         p2[contp2]=tmp;
  43.                         contp2++;
  44.                     }
  45.                     else{
  46.                         p2[contp2]=tmp;
  47.                         contp2++;
  48.                     }
  49.                     }
  50.                 break;
  51.                 case '*':case '/':
  52.                     if(contp2 <= 0){        //Si p2 está vacío mete operador
  53.                         p2[contp2]=tmp;
  54.                         contp2++;
  55.                     }
  56.                     else{
  57.                     if(p2[contp2-1]=='('||p2[contp2-1]=='-'||p2[contp2-1]=='+'){
  58.                         p2[contp2]=tmp;
  59.                         contp2++;
  60.                     }
  61.                     else{
  62.                         for(int j=contp2; j>0; j--){        //Paso a p1
  63.                             if(p2[contp2-1]=='(')   //Checa si comienzan operaciones anidadas
  64.                                 contp2=j-1;
  65.                             else{
  66.                                 p1[contp1]=p2[j-1];
  67.                                 contp1++;
  68.                             }
  69.                         }
  70.                         contp2++;
  71.                         p2[contp2]=tmp;
  72.                         contp2++;
  73.                     }
  74.                 }
  75.                 break;
  76.                 case '+':case '-':
  77.                     if(contp2 <= 0){        //Si p2 está vacío mete operador
  78.                         p2[contp2]=tmp;    
  79.                         contp2++;
  80.                     }
  81.                     else{
  82.                     if(p2[contp2-1]=='('){  //Checa si comienzan operaciones anidadas
  83.                         p2[contp2]=tmp;
  84.                         contp2++;
  85.                     }
  86.                     else{
  87.                         for(int j=contp2; j>0; j--){   //Si no son anidadas simplemente pasa a p1
  88.                             if(p2[contp2-1]=='('){
  89.                                 contp2=j-1;
  90.                             }
  91.                             else{
  92.                                 p1[contp1]=p2[j-1];
  93.                                 contp1++;
  94.                             }
  95.                         }
  96.                         contp2++;
  97.                         p2[contp2]=tmp;
  98.                         contp2++;
  99.                     }
  100.                     }
  101.                 break;
  102.                 case ')':if(contp2 <= 0){       //Hace push de p2 a p1, solo si hay un solo operador
  103.                     p2[contp2]=tmp;
  104.                     contp2++;
  105.                 }
  106.                 else{
  107.                     for(int j=contp2; j>0; j--){    //Paso a p1
  108.                         if(p2[contp2-1]=='(')
  109.                             contp2=j-1;
  110.                         else{
  111.                             p1[contp1]=p2[j-1];
  112.                             contp1++;
  113.                         }
  114.                     }
  115.                 }
  116.                     break;
  117.                 default:
  118.                     p1[contp1]=tmp;
  119.                     contp1++;
  120.                     break;
  121.                 }
  122.             }
  123.                 for(int  i=0;i<longitud;i++)        //Imprime el sufijo
  124.                      sufijo+= p1[i];
  125.             JOptionPane.showMessageDialog(null,sufijo);
  126.         }
  127.  
  128.  
  129.  

Código: Text
  1.  
  2.        
  3.    //Método que convierte el infijo en prefijo
  4.         public void Aprefijo(String infijo, int longitud){
  5.             char p1[]=new char[longitud], p2[]=new char[longitud];
  6.             String prefijo="";
  7.             int contp1=0, contp2=0;
  8.             for(int i=longitud-1;i>=0;i--){
  9.                 char tmp=infijo.charAt(i);
  10.                 switch(tmp){
  11.                 case '^':case')':
  12.                     if(contp2<=0){      //Si p2 está vacio, mete el operador
  13.                         p2[contp2]=tmp;
  14.                         contp2++;
  15.                         }
  16.                         else{
  17.                     p2[contp2]=tmp;
  18.                     contp2++;
  19.                     }break;
  20.                 case '/':case '*':
  21.                     if(contp2<=0){      //Si p2 está vacio, mete el operador
  22.                         p2[contp2]=tmp;
  23.                         contp2++;
  24.                         }
  25.                         else{
  26.                     if(p2[contp2-1]=='^'){
  27.                         while(p2[contp2]-1=='^'){
  28.                             for(int j=contp2; j>0; j--){    //Paso a p1
  29.                                 if(p2[contp2-1]==p2[contp2-2]){
  30.                                     contp2=j-1;
  31.                                     j=0;
  32.                                 }
  33.                                 else{
  34.                                     p1[contp1]=p2[j-1];
  35.                                     contp1++;
  36.                                 }
  37.                         contp2++;
  38.                         }
  39.                         p2[contp2]=tmp;
  40.                         contp2++;
  41.                         }
  42.                     }
  43.                     else{
  44.                         p2[contp2]=tmp;
  45.                         contp2++;
  46.                     }
  47.                 }break;
  48.                 case '+':case '-':             
  49.                     if(contp2<=0){          //Si no hay nada en p2, mete el operador
  50.                         p2[contp2]=tmp;
  51.                         contp2++;
  52.                         }
  53.                         else{
  54.                     if(p2[contp2-1]==')'||p2[contp2-1]=='+'||p2[contp2-1]=='-'){
  55.                         p2[contp2]=tmp;
  56.                         contp2++;
  57.                     }
  58.                     else{
  59.                         while(!(p2[i-1]==')'||p2[i-1]=='+'||p2[i-1]=='-')){
  60.                             for(int j=contp2; j>0; j--){    //Paso a p1
  61.                                 if(p2[contp2-1]==p2[contp2-2]){
  62.                                     contp2=j-1;
  63.                                     j=0;
  64.                                 }
  65.                                 else{
  66.                                     p1[contp1]=p2[j-1];
  67.                                     contp1++;
  68.                                 }
  69.                             contp2++;
  70.                         }
  71.                         p2[contp2]=tmp;
  72.                         contp2++;
  73.                         }
  74.                     }
  75.                 }break;
  76.                 case '(':
  77.                     if(contp2<=0){              //Si no hay nada agrega a p2
  78.                         p2[contp2]=tmp;
  79.                         contp2++;
  80.                         }
  81.                         else{
  82.                     for(int j=contp2; j>0; j--){    //Paso a p1
  83.                         if(p2[contp2-1]==')'){      //Si el de abajo de tmp es ')', baja el contador
  84.                             contp2=j-1;
  85.                             j=0;
  86.                         }
  87.                         else{
  88.                             p1[contp1]=p2[j-1];
  89.                             contp1++;
  90.                         }
  91.                     }
  92.                 }break;
  93.                 default:p1[contp1]=tmp;          
  94.                     contp1++;
  95.                     break;
  96.                 }
  97.                
  98.             }
  99.             for(int i=longitud-1; i>=0 ;i--)
  100.                 prefijo=""+prefijo+""+p1[i];
  101.             JOptionPane.showMessageDialog(null,prefijo);
  102.         }
  103.  
  104.