Codigo:
//Conversión de notación Infija a Postfija mediante uso de pilas
package infixpostfix4;
import java.util.Scanner;
import java.util.Stack;
public class InfixPostfix4 {
public static void main(String[] args) {
//Entrada de datos
System.out.println("*Escribe una expresión algebraica: ");
Scanner leer = new Scanner(System.in);
//Depurar la expresion algebraica
String expr = depurar(leer.nextLine());
String[] arrayInfix = expr.split(" ");
//Declaración de las pilas
Stack
Stack
Stack
//Añadir la array a la Pila de entrada (E)
for (int i = arrayInfix.length - 1; i >= 0; i--) {
E.push(arrayInfix[i]);
}
try {
//Algoritmo Infijo a Postfijo
while (!E.isEmpty()) {
switch (pref(E.peek())){
case 1:
P.push(E.pop());
break;
case 3:
case 4:
while(pref(P.peek()) >= pref(E.peek())) {
S.push(P.pop());
}
P.push(E.pop());
break;
case 2:
while(!P.peek().equals("(")) {
S.push(P.pop());
}
P.pop();
E.pop();
break;
default:
S.push(E.pop());
}
}
//Eliminacion de `impurezas´ en la expresiones algebraicas
String infix = expr.replace(" ", "");
String postfix = S.toString().replaceAll("[\\]\\[,]", "");
//Mostrar resultados:
System.out.println("Expresion Infija: " + infix);
System.out.println("Expresion Postfija: " + postfix);
}catch(Exception ex){
System.out.println("Error en la expresión algebraica");
System.err.println(ex);
}
}
//Depurar expresión algebraica
private static String depurar(String s) {
s = s.replaceAll("\\s+", ""); //Elimina espacios en blanco
s = "(" + s + ")";
String simbols = "+-*/()";
String str = "";
//Deja espacios entre operadores
for (int i = 0; i < s.length(); i++) {
if (simbols.contains("" + s.charAt(i))) {
str += " " + s.charAt(i) + " ";
}else str += s.charAt(i);
}
return str.replaceAll("\\s+", " ").trim();
}
//Jerarquia de los operadores
private static int pref(String op) {
int prf = 99;
if (op.equals("^")) prf = 5;
if (op.equals("*") || op.equals("/")) prf = 4;
if (op.equals("+") || op.equals("-")) prf = 3;
if (op.equals(")")) prf = 2;
if (op.equals("(")) prf = 1;
return prf;
}
}
Resultado:
run:
*Escribe una expresión algebraica:
2*(23+6)-1
Expresion Infija: (2*(23+6)-1)
Expresion Postfija: 2 23 6 + * 1 -
BUILD SUCCESSFUL (total time: 4 seconds)
como evaluo esta misma?
ResponderEliminarhttp://censorcosmico.blogspot.com.es/2012/09/evaluar-expresion-postfija-usando-pilas.html
Eliminargracias pero una pregunta como guardo postfix para evaluar con el metodo del link anterior?
ResponderEliminarSi lo que quieres es evaluar una expresión directamente dale al siguiente link:
Eliminarhttp://censorcosmico.blogspot.com.es/2012/06/obtener-el-resultado-numerico-de-una.html
Hola, quiero saber para qué pones este método? Gracias
ResponderEliminar//Depurar expresión algebraica
private static String depurar(String s) {
s = s.replaceAll("\\s+", ""); //Elimina espacios en blanco
s = "(" + s + ")";
String simbols = "+-*/()";
String str = "";
//Deja espacios entre operadores
for (int i = 0; i < s.length(); i++) {
if (simbols.contains("" + s.charAt(i))) {
str += " " + s.charAt(i) + " ";
}else str += s.charAt(i);
}
return str.replaceAll("\\s+", " ").trim();
}
Simplemente es para separar los números de los simbolos con un espacio.
EliminarEj:
2*(23+6) -1
lo convierte en:
( 2 * ( 23 + 6 ) - 1 )
Y con ese nuevo formato queda lista para agregarla a la pila de entrada.
y como es posible visualisar el resultado de la esprecion algebraica por ejemplo :(4*2)+(4*2) =16
ResponderEliminarPrimero tienes que pasar la expresión "(4*2)+(4*2)" a notación Postfija que da como resultado "4 2 * 4 2 * +".
EliminarSeguidamente calcularla con el siguiente codigo:
http://censorcosmico.blogspot.com.es/2012/09/evaluar-expresion-postfija-usando-pilas.html
Y si quieres calcular el resultado de la expresión directamente:
http://censorcosmico.blogspot.com.es/2012/06/obtener-el-resultado-numerico-de-una.html
Porq colocaste el while en los casos 3 y 4 no vastaria un IF
ResponderEliminarsi no existe caso 5
ResponderEliminarpor que no usas el caso 3, la potencia no la recorre?
ResponderEliminarPrueba de eliminar linea del caso 3 "case 3:" y entenderás el porqué.
EliminarUn saludo.
por que no tiene nada el caso 3 yo la elimine y no hace nada
Eliminartampoco entiendo por q?? y tengo más preguntas
Eliminarcomo se aria para que marque si la expresión introducida no es posible pasarla ejem: 5++
ResponderEliminarBuenas tardes, oye una pregunta, de donde sacas esto package infixpostfix4; me seria de mucha ayuda este código.
ResponderEliminarMuchas gracias.
Esa linea la genera automaticamente la IDE Netbeans. (infixpostfix4 es el nombre en el que guardamos el proyecto).
Eliminarbuenas tardes, una pregunta y si quiero evaluar una expresión ya dada en postfija por el usuario que código podría usar? gracias!
ResponderEliminarcomo paso un postfijo a infijo? ayudaaa
ResponderEliminarBuen programa gracias..........
ResponderEliminarXD
buen programa :) corre excelente aunque no entiendo muy bien algunas cosas como el funcionamiento del .peek,tambien esos dos caso que estan vacios hehe
ResponderEliminarPorq no sirve para calcular una potencia?
ResponderEliminarQue linea se le puede agregar para que funcione
ResponderEliminarPodrías darme el caso de la potencia
ResponderEliminaruna pregunta y si quiero evaluar tambien el operador % y ^ como seria entonces el programa?
ResponderEliminarDarle al operador "%" la misma preferencia que "*" y "/" (preferencia = 4):
Eliminarif (op.equals("*") || op.equals("/") || op.equals("%")) prf = 4;
En este ejemplo no evalua, sino que convierte la notacion infija a postfija.
y como hago si me piden el mismo codigo pero con operandos mayores a 9?
ResponderEliminarQue tal como vas, mi pregunta es la siguiente, porque apilas la expresión de derecha a izquierda
ResponderEliminarfor (int i = arrayInfix.length - 1; i >= 0; i--) {
E.push(arrayInfix[i]);
}
no se puede de izquierda a derecha?
GRACIAS
Estamos trabajando con "Pilas" y eso implica que el primero que entra es el último en salir (metodo LIFO). En nuestro ejemplo necesitamos invertir el orden de la cadena para la entrada de los valores en la Pila.
EliminarSi quisieras hacer de izquierda a derecha habría que utilizar las "Colas" y no las "Pilas", el primero que entra es el primero en salir (metodo FIFO).
AAA bien bien entiendo Gracias por aclararme eso Te lo agradezco muchas gracias ;)
EliminarQuisera que me ayudes con una exprecion matematica un método que valide el ingreso de la expresión infija. en caso haya algún error, el programa debe informarlo. Ejemplos de errores: parèntesis incorrectos, opradores seguidos, etc. (A+B *C )A-H( A+*P A/B-)
ResponderEliminarSe me ocurre usar las "Expresiones Regulares". http://censorcosmico.blogspot.com.es/2012/02/expresiones-regulares-i-tabla-de.html
EliminarEn tu caso para validar una formula matematica o ecuación el patrón seria siguiente:
" /(([\+\-\/\*\^]?)([(]*(([(]?(([+-]?\d+[.,]?(\d+)?)([e][+-]\d+)?)[)]?)|([(]?value[)]?))[)]*)?(([(]*([(]?(([+-]?\d+[.,]?(\d+)?)([e][+-]\d+)?)[)]?)|([(]?value[)]?))[)]*)?([\+\-\/\*\^])([(]*(([(]?(([+-]?\d+[.,]?(\d+)?)([e][+-]\d+)?)[)]?)|([(]?value[)]?))[)]*))+/g ".
De gran ayuda
ResponderEliminarGracias!
Buen día, si quisiera reemplazar el operador ^ por ** como seria la solución?. Te agradecería una respuesta oportuna
ResponderEliminarno corre mi programa, no tiene void, podria acompletarlo
ResponderEliminarSi se quieren agregar mas operaciones como factorial (!) que tiene mayor jerarquía que la multiplicación pero menor que la potencia, como debería hacerse el cambio en el switch?
ResponderEliminarQue tal amigo viendo tu programa si funciona y muy bien hecho sabes yo quiero ver si me puedes ayudar con un programa similar solo que en lugar de pasar de infija a postfija que me traslade a prefija ya que tengo un proyecto en la U pero la verdad no se como realizarlo honestamente se me dificulta usar java y le necesito crear una interface grafica te agradeceria muxo amigo si me pudieras ayudar
ResponderEliminarhola, como puedo agregar la notación prefija y el resultado de de la operación??????
ResponderEliminarAmigo eres un maestro, muchas gracias por el código y por la explicación.
ResponderEliminarHombre tu codigo tiene un error cuando se usa ^
ResponderEliminarBuenas tardes una pregunta que hace esta linea mejor dicho que compara(pref(E.peek()))
ResponderEliminarEsa linea devuelve la preferencia de carácter de la cima de la pila de entrada. Si por ejemplo la cima de la pila de entrada tiene el caracter "+", devolverá su preferencia en este caso el valor 3.
EliminarDisculpa para que metes el array en la pila?
ResponderEliminarUso el array para invertir el orden de la cadena para la entrada de los valores en la Pila.
EliminarHola disculpa, si ya tengo el convertidor de infijo a posfijo, ahora como le ago para que me acepte valores y que me aga las operaciones correspondientes?? ayuda son principiante
ResponderEliminarHola, disculpa porque el 99? podrias explicarme el programa mas a detalle?
ResponderEliminar//Jerarquia de los operadores
private static int pref(String op) {
int prf = 99;
if (op.equals("^")) prf = 5;
if (op.equals("*") || op.equals("/")) prf = 4;
if (op.equals("+") || op.equals("-")) prf = 3;
if (op.equals(")")) prf = 2;
if (op.equals("(")) prf = 1;
return prf;
}
}
Ahí tienes la explicación con más detalle:
Eliminarhttp://censorcosmico.blogspot.com.es/2012/09/primeros-pasos-para-conversion-infijo.html
Explicación x favor
Eliminartry {
//Algoritmo Infijo a Postfijo
while (!E.isEmpty()) {
switch (pref(E.peek())){
case 1:
P.push(E.pop());
break;
case 3:
case 4:
while(pref(P.peek()) >= pref(E.peek())) {
S.push(P.pop());
}
P.push(E.pop());
break;
case 2:
while(!P.peek().equals("(")) {
S.push(P.pop());
}
P.pop();
E.pop();
break;
default:
S.push(E.pop());
}
}
LO QUE NO ENTIENDO ES POR QUE EL "CASE 3" NUNCA CERRO CON "BREACK"
ResponderEliminarO EN QUE MOMENTO SE USO???
NECESITO LA RESPUESTA GRACIAS
me gustaria conocer el codigo dada una exprecion infija a prefija ya que no logro esa operacion
ResponderEliminarBuenos días. Esta genial el código. Tengo dos dudas. a) Qué hago para poner expresiones con potencias?. Si lo que quiero evaluar son potencias, escritas de la forma \frac{2}{33} (código latex). Cómo podría introducirlas a la pila. Muchísimas gracias.
ResponderEliminarEvalué con esta expresión ((5+9^(1/2))/(4+4)+2)^3-(5*2) y su resultado postfijo es este: 5 9^ 1 2 / + 4 4 + / 2 + ^3 5 2 * -
ResponderEliminarPERO. el ultimo ejercicio de este video https://www.youtube.com/watch?v=d7UZdz_yGXQ evaluando la misma expresión da como resultado 5 9 1 2 / ^ + 4 4 +/ 2 + 3 ^ 5 2 * -... me gustaria me ayuden a entender si esta bien el programa si se equivocó el programa o si esta mal el video o está bien el video... o si es lo mismo. Muchas Gracias
Añadiendo a lo anterior acabo de probar el codigo de evaluar la expresion postifja http://censorcosmico.blogspot.com.co/2012/09/evaluar-expresion-postfija-usando-pilas.html que esta recomendado en los comentarios con la expresion que arroja el primer programa 5 9^ 1 2 / + 4 4 + / 2 + ^3 5 2 * - y como resultado tengo error.
Eliminarpor lo q veo no esta en el segundo codigo implementado la potencia (^)
Eliminareso es todo dude gracias
ResponderEliminaruna pregunta, como se hace para que una expresión infija se convierta a prefija???
ResponderEliminarEncontre un problema, intente solcionarlo pero por ejemplo si la expresion empieza con -2+3 la expresion en postfija seria -2 3 +. En esta caso la convierte en 2 - 3 + y eso para evaluarlo genera un error. Si alguien tiene la solucion para ello me gustaria saberlo
ResponderEliminarA este algoritmo aún le queda margen de mejora, como en este caso y operaciones con potencias "^" que tampoco da el resultado correcto. Espero solventarlos en posteriores revisiones.
EliminarSaludos,
Disculpa que debo cambiar en el algoritmo para que cambie de infijo a prefijo y de antemano muchas gracias
ResponderEliminartry {
//Algoritmo Infijo a Postfijo
while (!E.isEmpty()) {
switch (pref(E.peek())){
case 1:
P.push(E.pop());
break;
case 3:
case 4:
while(pref(P.peek()) >= pref(E.peek())) {
S.push(P.pop());
}
P.push(E.pop());
break;
case 2:
while(!P.peek().equals("(")) {
S.push(P.pop());
}
P.pop();
E.pop();
break;
default:
S.push(E.pop());
}
}
Hola, alguien que me ayude a sacar la ecuación de la notación polaca inversa? esta en este método.Por favor
ResponderEliminarpublic double evaluaPolaca(String s) {
double resultado = 0;
String v[] = s.split(",");
PilaS pila = new PilaS();
for (String x : v) {
// Aqui me falta la ecuacion
}
resultado=Double.parseDouble(pila.pop().getDato());
return resultado;
}
}
Tienen un codigo que: de infija pasa a postfija y visceversa y de el resultado de la operacion en el mismo codigo?
ResponderEliminarporque =99?
ResponderEliminarno me corre el programa
ResponderEliminarHola, quisiera saber qué hace este codigo:
ResponderEliminar//Eliminacion de `impurezas´ en la expresiones algebraicas
String infix = expr.replace(" ", "");
String postfix = S.toString().replaceAll("[\\]\\[,]", "");
como podria implementarlo con recursividad?
ResponderEliminarMejor pon un tutorial para entender mejor. Se ma hace mas facil.
ResponderEliminarporque? int prf = 99; ?
ResponderEliminarPorque cuando se pone una ecuación con ^ la hace mal.
ResponderEliminarVeras quise evaluar ((6-(2+3))*(3+8/2))^2+3 y me da este resultado 6 2 3 + - 3 8 2 / + * ^ 2 3 + cuando debería ser 6 2 3 + - 3 8 2 / + * 2 ^ 3 +
o incluso cuando pongo 6^2 me da 6^2 en lugar de 62^
como puedo adaptarlo con acciones semánticas?
ResponderEliminarGracias me has salvado la vida, te mereces un millón de pizzas
ResponderEliminarbuenas, gracias por tu codigo, solo tengo una duda.
ResponderEliminar(a^2+b^2)*(m-n)
acepta potencia?