Pasar de Infijo a Postfijo [Java]
Hola Muchach@s.. a ver si me pueden ayudar con este asuntito..
tengo que hacer un programa ( como lo dice el título) que pase una expresión infija a postfija..
La expresion tiene que estar Previamente creada en un String ...
así como lo muestra el código:
Clase Pila
public class Pila {
private char pila[];
private int tope = -1;
public Pila(){
this.pila = new char[10];
}
public char pop(){
//saca
char ret;
ret = pila[tope];
tope--;
return ret;
}
public void push(char x){
//meter al inicio
tope++;
pila[tope]=x;
}
public char peek(){
//retorna el primero sin sacarlo
return pila[tope];
}
public void Show(){
for(int i = tope;i>-1 ;i--){
System.out.print(pila[i]);
}
System.out.println();
}
public int Size(){
return tope+1;
}
}
Main
public class InfijaToPostfija {
public static void main (String[]args){
int i;
String Ecuacion = " A+C*C+C";
char check;
Pila Termino = new Pila();
Pila Simbolo = new Pila();
Pila vueltaT = new Pila();
Pila vueltaS = new Pila();
for(i = 0 ; i<Ecuacion.length() ; i++){
check = Ecuacion.charAt(i);
if(check=='+' ||
check=='-' ||
check=='*' ||
check=='/' ||
check=='^')
{Simbolo.push(check);}
else
{Termino.push(check);}
}
for(i=0 ;i<=Simbolo.Size(); i++){
vueltaS.push(Simbolo.pop());
}
for(i=-1 ;i<=Termino.Size(); i++){
vueltaT.push(Termino.pop());
}
for(i=0 ; i<vueltaT.Size() ;i++){
if(vueltaT.Size()>1)
{System.out.print(vueltaT.pop());
System.out.print(vueltaT.pop());}
else
{System.out.print(vueltaT.pop());}
System.out.print(vueltaS.pop());
}
System.out.println();
}
}
el problema es que cuando pongo más de 3 términos ... se come uno...
me podrían ayudar?..
Saludos y de ante mano muchas gracias
- Inicie sesión o regístrese para enviar comentarios
- 3158 lecturas


La solución es trivial
, no te la voy a decir directamente porque así no aprendes nada, pero te voy a dar un par de pistas, ¿listo?, ahí van:

Mira la clase Pila, sobre todo los métodos de pila(push, pop) y luego piensa si tiene algún sentido que hagas estos bucles for:
for(i=0 ;i<=Simbolo.Size(); i++){for(i=-1 ;i<=Termino.Size(); i++){
for(i=0 ; i<vueltaT.Size() ;i++){
No sé como te pedirán la implementación, pero haciendo esto:
if(vueltaT.Size()>1){System.out.print(vueltaT.pop());
System.out.print(vueltaT.pop());}
else
{System.out.print(vueltaT.pop());}
System.out.print(vueltaS.pop());
desde luego no estás poniéndolo correctamente en forma postfija, ya no sólo lo digo por la precedencia de operadores sino también porque los términos que operas cuando está en forma postfija no tienen nada nada nada que ver con la ecuación inicial, exceptuando los símbolos y los términos que son los mismos.


Puede que con el ejemplo que pones te funcione, pero desde luego no está nada bien. Piénsalo.
ya estoy entrando en un colapso nervioso XD!...
entiendo tu idea... se lo que me queires decir.. por que se pasa de los limites de las pilas ...
pero si no logro hacer la primera parte ... no puedo implementar las reglas de prioridades..
Podrías darme una ayuda más clara por favor?..
con un empujón directo creo que lo haría
Muchas Gracias
ya estoy entrando en un colapso nervioso XD!...
entiendo tu idea... se lo que me queires decir.. por que se pasa de los limites de las pilas ...
pero si no logro hacer la primera parte ... no puedo implementar las reglas de prioridades..
Podrías darme una ayuda más clara por favor?..
con un empujón directo creo que lo haría
Muchas Gracias
Si de verdad lo entiendes tendrías la solución, piensa más sobre ello.
PISTA: Cuando ejecutas push o pop, cambia el valor que devuelve this.Size()
cambie los for por while :P
aun no me resulta, pero falta poco
cambie los for por while :P
aun no me resulta, pero falta poco
Bien, bien, vas por buen camino.
Supongo que habrán sido algo así:
while (Elemento.Size() > 0) {Ahora mira la otra parte de código que te señalé, ahí se encuentra el otro error conceptual que hace que te salga una respuesta sin todos los operadores que debería tener.
si si .. algo así lo usé ...
la verdad un primo igual me ayuda por otro lado..
ta casi ya *o* ...
Llegue a esto:
import java.util.Stack;
public class InfijaToPostfija {
public static void main (String[]args){
//Variables utilizables en el programa
int i;
char check;
//Ecuacion en Notación Infija, Puede ser Cambiada
String Ecuacion = "A*B+C/D*E";
//4 Pilas Termino(A,B,C...Z), Simbolo(+,-,*,/)
//vuelta simbolo y Vuelta Termino
Stack Termino = new Stack();
Stack Simbolo = new Stack();
Stack vueltaT = new Stack();
Stack vueltaS = new Stack();
//bucle que separa Termino y simbolos a cada Pila
for(i = 0 ; i<Ecuacion.length() ; i++){
check = Ecuacion.charAt(i);
if(check=='+' ||
check=='-' ||
check=='*' ||
check=='/' ||
check=='^')
{Simbolo.push(check);}
else
{Termino.push(check);}
}
//Invertir el Orden de Simbolo
while(!Simbolo.isEmpty()){
vueltaS.push(Simbolo.pop());
}
//invertir el Orden de Termino
while(!Termino.isEmpty()){
vueltaT.push(Termino.pop());
}
/*Debuger...
System.out.println("Tamaño de VueltaT: "+vueltaT.size());
System.out.println("Tamaño de VueltaS: "+vueltaS.size());
*/
//IMPRIME Ecuacion Infija
System.out.println("Infijo: "+Ecuacion);
//IMPRIME TítuloPrevio a la Ecuacion Postfija
System.out.print("PostFijo: ");
//Proceso de Transformacion a Notación Postfija
while(!vueltaT.isEmpty()){
//Variable Auxiliar
String ver =null;
//Si existen más de 2 TERMINOS: Imprime los 2 INMEDIATOS en la Pila
if(vueltaT.size()>1)
{System.out.print(vueltaT.pop());
System.out.print(vueltaT.pop());}
//Sino: Imprimer uno solo
else
{System.out.print(vueltaT.pop());}
//Aplicacion de Variable Auxiliar
ver = vueltaS.pop().toString();
//si vacie la pila con mi variable auxiliar, IMPRIMO mi variable auxiliar
if(vueltaS.isEmpty())
{System.out.print(ver);}
//Sino: SI: Mi variable Auxiliar tiene 'MENOS' Pero que mi valor INMEDIATO en mi pila Simbolo
//IMPRIME 1 Termino + 1 Simbolo de la Pila Y además agrego a mi pila mi valor de Variable Auxiliar
else
{if((ver.equals("+") || ver.equals("-")) && (vueltaS.peek().toString().equals("*") || vueltaS.peek().toString().equals("/")) )
{System.out.print(vueltaT.pop());
System.out.print(vueltaS.pop());
vueltaS.push(ver);}
//SI no: IMPRIME mi variable Auxiliar
else
{System.out.print(ver);}
}
//Cierre While
}
//Bucle que IMPRIME el resto de los Simbolos en el caso que los terminos se terminen
while(!vueltaS.isEmpty()){
System.out.print(vueltaS.pop());
}
//Salto de linea para darle un orden a la Expresion POSTFIJa ya GEnerada
System.out.println();
//Cierre de Clase y Clase Main
}
}
PERO!...
creo que está mal el algoritmo ....
sacame de la duda porfavor :D!..
saludos amigo :D
Llegue a esto:
[...]
PERO!...
creo que está mal el algoritmo ....
sacame de la duda porfavor :D!..
saludos amigo :D
Sigues teniendo uno de los errores que tenías al principio:
if (vueltaT.size()>1) {System.out.print(vueltaT.pop());
System.out.print(vueltaT.pop());
}
Según este if, vas a imprimir dos términos por cada símbolo, y si lo piensas un poco, en la forma postfija sólo la primera vez se escriben dos términos por cada símbolo, después imprimes un término por cada símbolo.