Ejemplo 1
Clase Pila
package Expresiones_Pila;
public class Pila {
private int pila[];
private int dato;
private int tope = -1;
private int max = 0;
private boolean res;
Pila(int max) {//el constructor pide el tamano de la pila
this.max = max;
pila = new int[max];//se crea un arreglo del tamano pasado ateriormente
dato = 0;
}
public void borrarpila() {//metodo para borrar toda la pila
tope = -1;//mandamos el tope al principio, esto indica que la pila esta vacia
}
public boolean Pila_llena() {
if (tope == (max - 1)) {
res = true;
} else {
res = false;
}
return res;
}
public boolean Pila_vacia() {
if (tope == -1) {
res = true;
} else {
res = false;
}
return res;
}
public boolean poner(int dato) {
if (Pila_llena()) {
System.err.print("Desbordamiento: Pila llena");
} else {
tope++;
pila[tope] = dato;
res = true;
}
return res;
}
public int quitar() {
if (Pila_vacia()) {
System.err.print("Sub-Desbordamiento: Pila vacia");
} else {
dato = pila[tope];
tope--;
}
return dato;
}
public void mostrar() {
for (int i = tope; i >= 0; i--) {
System.out.println(pila[i]);
}
}
public String copiarPila(Object[] pila) {
Object[] copy = new Object[pila.length];
String muestra = "";
System.arraycopy(pila, 0, copy, 0, pila.length);
for (int i = 0; i < copy.length; i++) {
muestra += copy[i] + " ";
}
return muestra;
}
}
Clase Expresiones
package Expresiones_Pila;
import java.util.*;
public class Expresiones {
private int sacaTope, sacaSig, resultado;
private ArrayList operadores;
private Pila pilaPost;
private Pila pilaPre;
public Expresiones(String expresionPost[], String expresionPre[]) {
pilaPost = new Pila(expresionPost.length);
pilaPre = new Pila(expresionPre.length);
}
public void Postfija(String[] expresionPost) {//evalua una expresion dada en forma Postfija
operadores = new ArrayList<>();//guardamos los operadores en una lista
operadores.add("+");
operadores.add("-");
operadores.add("*");
operadores.add("/");
operadores.add("^");
for (String car : expresionPost) {//recorremos la expresion con una variable tipo String
if (operadores.contains(car)) {//si encontramos un operador de los listados antes entonces
sacaTope = pilaPost.quitar();//saca el tope
//System.out.println("sacaTope: " + sacaTope);
sacaSig = pilaPost.quitar();//luego saca el siguiente del tope
//System.out.println("sacaSig: " + sacaSig);
//System.out.println("car: " + car);
operacionPost(sacaTope, sacaSig, car);//y realiza las operaciones que corresponden
} else {//si encuentra un operando, lo agrega directamente a la pila
pilaPost.poner(Integer.parseInt(car));
//System.out.println("entra: " + car);
}
//pilaPost.mostrar();
}
pilaPost.mostrar();//mostramos el elemento que queda en la pila
}
public void Prefija(String[] expresionPre) {//evalua una expresion dada en forma Prefija
String car;
operadores = new ArrayList<>();
operadores.add("+");
operadores.add("-");
operadores.add("*");
operadores.add("/");
operadores.add("^");
for (int i = (expresionPre.length - 1); i >= 0; i--) {//recorremos la expresion en oreden inverso a la anterior
car = expresionPre[i];//guardamos los caracteres en una variable, para despues utilizarlos
if (operadores.contains(car)) {
sacaTope = pilaPre.quitar();
// System.out.println("sacaTope: " + sacaTope);
sacaSig = pilaPre.quitar();
// System.out.println("sacaSig: " + sacaSig);
// System.out.println("car: " + car);
operacionPre(sacaTope, sacaSig, car);
} else {
pilaPre.poner(Integer.parseInt(car));
// System.out.println("entra: " + car);
}
// pilaPre.mostrar();
}
pilaPre.mostrar();
}
public int operacionPost(int sacaTope, int sacaSig, String operador) {//calcula la expresion en Postfija
if (operador.equals("^")) {
resultado = (int) Math.pow(sacaSig, sacaTope);
pilaPost.poner(resultado);
} else if (operador.equals("/")) {
resultado = sacaSig / sacaTope;
pilaPost.poner(resultado);
} else if (operador.equals("+")) {
resultado = (sacaSig + sacaTope);
pilaPost.poner(resultado);
} else if (operador.equals("-")) {
resultado = sacaSig - sacaTope;
pilaPost.poner(resultado);
} else if (operador.equals("*")) {
resultado = sacaSig * sacaTope;
pilaPost.poner(resultado);
}
return resultado;
}
public int operacionPre(int sacaTope, int sacaSig, String operador) {//calcula la expresion en Prefija
if (operador.equals("^")) {
resultado = (int) Math.pow(sacaTope, sacaSig);
pilaPre.poner(resultado);
} else if (operador.equals("/")) {
resultado = sacaTope / sacaSig;
pilaPre.poner(resultado);
} else if (operador.equals("+")) {
resultado = (sacaTope + sacaSig);
pilaPre.poner(resultado);
} else if (operador.equals("-")) {
resultado = sacaTope - sacaSig;
pilaPre.poner(resultado);
} else if (operador.equals("*")) {
resultado = sacaTope * sacaSig;
pilaPre.poner(resultado);
}
return resultado;
}
}
Clase Principal
package Expresiones_Pila;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Principal {
private static String expresionPost[] = {"6", "2", "3", "+", "-","3","8","2","/","+","*","2","^","3","+"};
private static String expresionPre[] = {"+", "2", "*", "3", "1"};
private static Expresiones exp;
public static void main(String args[]) {
exp = new Expresiones(expresionPost, expresionPre);
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int des = 0;
try {
System.out.println("Calcular: \n1.-Postfija\n2.-Prefija");
des = Integer.parseInt(br.readLine());
} catch (IOException e) {
System.out.println("Se esperaba un numero: " + e.getCause());
}
if (des == 1) {
System.out.print("Evaluar: ");
mostrarExpPost();
System.out.print("\nResultado: ");
exp.Postfija(expresionPost);
} else if (des == 2) {
System.out.print("Evaluar: ");
mostarExpPre();
System.out.print("\nResultado: ");
exp.Prefija(expresionPre);
}
}
public static void mostrarExpPost() {//muestra la expresion Postfija
for (int i = 0; i < expresionPost.length; i++) {
System.out.print(expresionPost[i]);
}
}
public static void mostarExpPre() {//muestra la expresion Prefija
for (int i = 0; i < expresionPre.length; i++) {
System.out.print(expresionPre[i]);
}
}
}
Ejemplo 2
public class Pilas {
public static void main(String[] args) {
String text = JOptionPane.showInputDialog("Dame infijo :");
System.out.println("Prefijo : "+ 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 tamaño = infijo.length();
Pila PilaDefinitiva = new Pila(tamaño);
Pila PilaTemp = new Pila(tamaño);
PilaTemp.push(')'); // Agregamos a la pila temporal un '('
for (int i = tamaño-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;
}
return res;
}
}
Resultado 1
Resultado 2
No hay comentarios:
Publicar un comentario