// Evaluar expresión en notación Postfija (solo num enteros)
package evalpost;
import java.util.Stack;
public class EvalPost {
public static void main(String[] args) {
//Entrada (Expresión en Postfija)
String expr = "2 23 6 + * 1 -"; // equivale a 2*(23+6)-1
String[] post = expr.split(" ");
//Declaración de las pilas
Stack < String >
Stack < String >
//Añadir post (array) a la Pila de entrada (E)
for (int i = post.length - 1; i >= 0; i--) {
E.push(post[i]);
}
//Algoritmo de Evaluación Postfija
String operadores = "+-*/%";
while (!E.isEmpty()) {
if (operadores.contains("" + E.peek())) {
P.push(evaluar(E.pop(), P.pop(), P.pop()) + "");
}else {
P.push(E.pop());
}
}
//Mostrar resultados:
System.out.println("Expresion: " + expr);
System.out.println("Resultado: " + P.peek());
}
private static int evaluar(String op, String n2, String n1) {
int num1 = Integer.parseInt(n1);
int num2 = Integer.parseInt(n2);
if (op.equals("+")) return (num1 + num2);
if (op.equals("-")) return (num1 - num2);
if (op.equals("*")) return (num1 * num2);
if (op.equals("/")) return (num1 / num2);
if (op.equals("%")) return (num1 % num2);
return 0;
}
}
Resultado:
run:
Expresion: 2 23 6 + * 1 -
Resultado: 57
BUILD SUCCESSFUL (total time: 0 seconds)
.
el codigo marca error en linea: P.push(evaluar(E.pop(), P.pop(), P.pop()) + "");
ResponderEliminarme podrian decir porque
Habia un error en la declaración de las pilas (ya corregido).
Eliminar//Declaración de las pilas
Stack < String > E = new Stack < String > (); //Pila entrada
Stack < String > P = new Stack < String > (); //Pila de operandos
Un saludo,
y como se evalua una expresion que no este declarada, que se tenga que introducir??
ResponderEliminarPues de la siguiente manera:
Eliminar//Entrada (Expresión en Postfija)
Scanner leer = new Scanner(System.in);
String expr = leer.nextLine();
Saludos,
lo hize y me muestra la misma expresion no la evalua ayudaa
EliminarPrueba esto:
Eliminarimport java.util.Scanner;
...
//Entrada (Expresión en Postfija)
Scanner leer = new Scanner(System.in);
String expr = leer.nextLine();
String[] post = expr.split(" ");
El programa se queda en "Run" y no pasa nada :(
EliminarEs porque no estas pidiendo ningún dato..
Eliminar↓↓↓↓↓↓↓↓↓↓↓Prueba con esto↓↓↓↓↓↓↓↓↓↓↓↓
Scanner x = new Scanner(System.in);
System.out.println("Ingrese dato"); //En esta parte pides la operación que deseas realizar
String expr = x.nextLine();//Posteriormente el scanner lee los datos ingresados..
String[] post = expr.split(""); //Y finalmente efectúa la operación..
ejemplo de conversión infija y postfija utilizando memoria estatica y dinámica con pilas
ResponderEliminarUna pregunta como hago para ingresar numeros reales en la cadena
ResponderEliminarPara números reales habria que cambiar el tipo de variables integer (numeros naturales) por double (reales).
EliminarSubstituye las siguientes lineas del codigo:
int num1 = Integer.parseInt(n1);
int num2 = Integer.parseInt(n2);
por estas otras:
double num1 = Double.parseDouble(n1);
double num2 = Double.parseDouble(n2);
al momento de realizar esto me lanza el mensaje: incompatibles type en las comparaciones siguientes
EliminarDebes cambiar el tipo de retorno de tu método:
Eliminarprivate static int evaluar(String op, String n2, String n1)
A
private static double evaluar(String op, String n2, String n1)
¿Qué es lo que contiene la pila P?, ya que estamos haciendo P.pop() y me parece no contiene algo...
ResponderEliminarContiene los operandos. En este ejemplo contiene 2, 23, 6 y 1.
Eliminarme muestra un error en evaluar que necesito crear ese metodo es que estoy pasandolo a metodos
ResponderEliminaramigo tienes facebook o correo? necesito tu ayuda, urge por favor
ResponderEliminarEscribe una expresión algebraica:
ResponderEliminar2*(23+6)-1
Expresion Infija: (2*(23+6)-1)
Expresion Postfija: 2 23 6 + * 1 -
Resultado : 51
DEBE SALIR 51 no 57 .. les agradecería que me corrijan si esque estoy mal.. aunque no lo creo
REVISEN XFAVOR..
Estas mal encaminada. el resultado de (2*(23+6)-1) es 57. Ya estaba bien.
Eliminarque tal bro puedes pasarme tu Facebook o correo para aclarar unas dudas te lo agradecería
ResponderEliminarola y si quisiera meter los datos por teclado como seria?? me urge por favor
ResponderEliminarEstas seguro de tu codigo?¡
ResponderEliminar5+5(2-8*9(4/8))
Expresion Infija: (5+5(2-8*9(4/8)))
Expresion Postfija: 5 5 2 8 9 4 8 / * - +
Resultado: 5.5
El verdadero resultado es: -165
El código de este articulo da por hecho que la expresión Postfija introducida sea correcta (siempre que utilizemos números enteros). De todas formas tienes razón en que el código de la conversión de infijo a postfijo le falta controlar un número seguido de abertura de parentesis "5(" ya que no es lo mismo poner 5(2+3) que 5*(2+3).
Eliminaramigo el programa funciona perfectamente pero yo necesito hacerlo sin la biblioteca de java podrias ayudarme ahi
ResponderEliminaramigo para que reconozca la potencia
ResponderEliminarUna pregunta ¿como hago para poder resolver igual potencias?
ResponderEliminaruno de los errores es que no saca la potenia y si ce la pones te la saca mal
ResponderEliminarTe agradezco por tu post me hasido de mucha utilidad.
ResponderEliminarMe gustaria saber de que manera podria modificar esta funcion para que el algoritmo tambien me reconozca otras expreciones como Log(), aqrt()?
Te agreadezco por tu respuesta.
private static int evaluar(String op, String n2, String n1) {
int num1 = Integer.parseInt(n1);
int num2 = Integer.parseInt(n2);
if (op.equals("+")) return (num1 + num2);
if (op.equals("-")) return (num1 - num2);
if (op.equals("*")) return (num1 * num2);
if (op.equals("/")) return (num1 / num2);
if (op.equals("%")) return (num1 % num2);
return 0;
}
Excelente me ha servido mucho tu código esta perdido totalmente.
ResponderEliminarHola a todos
ResponderEliminarNo me funciona con esta expresión
"4*2-2/4*67^2"
Alguna ayuda?
cuando es con flotantes y enteros?
ResponderEliminar¿Donde se declara la variable "evaluar"?, me marca un error, ahí
ResponderEliminar