Programación General > Java
infijo a prefijo y posfijo
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
[#] Página Siguiente
Ir a la versión completa