Вы находитесь на странице: 1из 5

Conversin de Infijo a Postfijo usando pilas

Ver referencia: Infijo-Posfijo


Codigo:
//Conversin de notacin 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 expresin algebraica:
");
Scanner leer = new Scanner(System.in);
//Depurar la expresion algebraica
String expr = depurar(leer.nextLine());
String[] arrayInfix = expr.split(" ");
//Declaracin de las
Stack < String > E =
entrada
Stack < String > P =
temporal para operadores
Stack < String > S =
salida

pilas
new Stack < String > (); //Pila
new Stack < String > (); //Pila
new Stack < String > (); //Pila

//Aadir 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 expresin algebraica");
System.err.println(ex);
}
}
//Depurar expresin 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 expresin algebraica:
2*(23+6)-1
Expresion Infija: (2*(23+6)-1)
Expresion Postfija: 2 23 6 + * 1 BUILD SUCCESSFUL (total time: 4 seconds)

Cdigo en Java, que realiza la conversin de Ecuaciones escritas en Infijo a Prefijo, por medio de un par de
pilas, ah queda el cdigo para aquellos que necesiten algo de ayuda. Si ponen atencin, se agregan un par
de parntesis, sirven para el volcado de los signos restantes.

NOTA: Se usa tambin la clase Pila, y debe ser volcado al revs.


Pilas.java

1
2
3
4
5
6
7

import javax.swing.JOptionPane;
public class Pilas {
public static void main(String[] args) {
String text = JOptionPane.showInputDialog("Dame
infijo :");
System.out.println("Prefijo : "+

8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54

Infijo2PrefijoTxt(text));
}
public static String Infijo2PrefijoTxt(String infijo){
Pila p1 = Infijo2Prefijo(infijo);
String text = "";
while (p1.i > 0)
text += p1.pop();
return text;
}
public static Pila Infijo2Prefijo(String infijo) {
infijo = '(' + infijo ; // Agregamos al final del
infijo un ')'
int tamao = infijo.length();
Pila PilaDefinitiva = new Pila(tamao);
Pila PilaTemp = new Pila(tamao);
PilaTemp.push(')'); // Agregamos a la pila temporal un
'('
for (int i = tamao-1; i > -1; i--) {
char caracter = infijo.charAt(i);
switch (caracter) {
case ')':
PilaTemp.push(caracter);
break;
case '+':case '-':case '^':case '*':case '/':
while (Jerarquia(caracter) >
Jerarquia(PilaTemp.nextPop()))
PilaDefinitiva.push(PilaTemp.pop());
PilaTemp.push(caracter);
break;
case '(':
while (PilaTemp.nextPop() != ')')
PilaDefinitiva.push(PilaTemp.pop());
PilaTemp.pop();
break;
default:
PilaDefinitiva.push(caracter);
}
}
return PilaDefinitiva;
}
public static int Jerarquia(char elemento) {
int res = 0;
switch (elemento) {
case ')':
res = 5; break;
case '^':
res = 4; break;
case '*': case '/':
res = 3; break;
case '+': case '-':
res = 2; break;
case '(':
res = 1; break;

55
56
57
58
59
60
61
62
63

}
}

}
return res;

Оценить