APLICACIONES DE PILAS
Estructuras de Datos
EXPRESIONES
Una expresin aritmtica:
Conjunto de operadores, variables y parntesis. Ejemplo:
A+B Esta forma de escribir las expresiones: NOTACION INFIJA El operador siempre va en medio de los operandos
En una expresin, las operaciones se ejecutan en un cierto orden
A+B*C no es igual que (A+B)*C Cada operador tiene su nivel de precedencia, recordemos:Parntesis : Potencia : Multiplicacin/divisin: Suma/Resta :
() ^ *,/ +,-*
Mayor prioridad
Menor Prioridad
NOTACIONES
A+B*C
Agrupar como establece la precedencia
A+(B*C) La de mayor precedencia primero
La notacin infija es la mas popularNo es la nica forma, hay dos mas
Convertir operacin por operacinA+(BC*)
NOTACION PREFIJA(POLACA)
La que le sigue en precedencia
A(BC*)+
+AB Aqu el operador va antes que los operandos AB+ Aqu el operador va despus que los operandos
Remover Parntesis
ABC*+ (A+B)*C
NOTACION POSFIJA(POLACA INVERSA)
Agrupar como establece la precedencia
No son nada difciles, pero
(A+B)*C La de mayor precedencia primero
Siempre tener en cuenta la precedencia de los operadores
Convertir operacin por operacin(AB+)*C (AB+)C*
Ejemplo. Pasar a postfija las siguientes expresiones: Ya no se necesitan parntesisEn postfija, el orden de los operadores es el verdadero orden de ejecucin
La que le sigue en precedencia
Remover Parntesis
AB+C*
EJERCICIOS EN CLASE
Convertir las siguientes expresiones a postfija y prefija
A*B/(A+C) A*B/A+C (A-B)^C+D A^B*C-D+E/F/(G+H) ((A+B) *C-(D-E))^(F+G)
EVALUACION DE EXPRESIONES POSFIJAS
Dadas
AB+C* ABC*+ Evaluelas, cuando A = 3, B = 4 y C = 5 La primera, resultado : 35 La segunda, resultado: 23
Que algoritmo sigui para evaluar estas expresiones?
AB+C* 7C*A+B -> 7 7*C -> 35
ABC*+ A20+B*C -> 20 20+A -> 23
EVALUACION: ALGORITMOPodra ser un una pila
Con lo anterior, ya tenemos una idea de que hacer
Deberamos poder recordar c/operando de la expresion Si encontramos un operadorLos dos ltimos operandos recordados son los usados y olvidados El resultado de la operacin, debe ser tambin recordado
2 veces Pop
As, hasta que la expresin termine
Push del resultado en la pila
ABC*+C B C*B A
C * B +A
EN PSEUDOCODIGOPila s; PilaVacia(s); while(no hayamos revisados toda la expresion) { simbolo = siguiente elemento if(simbolo es un operando) Push(s,simbolo); else{ operando1 = Pop(s); operando2 = Pop(s); valor = resultado de operacin simbolo entre operando1 y operando2 Push(s,valor); } } return(Pop(s));
EJERCICIO EN CLASE
Dada la siguiente expresin:6 2 3+ - 3 8 2 / + * 2 ^ 3 + Simule la pila, para evaluar esta expresin
CONVERSION DE INFIJA A POSFIJAA es un operando, es aadido directamente a la nueva expresin en postfija
El operador de mayor precedencia es el primero en aparecer en la expresin
A+B*C-D
El operador de mayor precedencia en la expresin ser el primero en aparecer en la conversin
ABC*+D-
A B C *+ D -
Pero aun no podemos continuar. Seguimos *Comparado con el de mayor + Es un operador.mayorse es un el con el de Si prioridadla operador, pero, Aqu terminamos de revisar comparando prioridad hasta ahora(el *), el compara con el ultimo hasta lo que vamos smbolo. expresin,mayorelprioridad. hasta ahora, el +. smbolo no tiene mayor no tiene Como* por recordado, no quedan aun En la pila, tiene revisando, el puede que prioridad si podemos es el de aadido Ahora que el +, el + yadecir, ser el * mayor el prioridad,Pero no en la prioridad. mejor, operadores. amayor operador de mayor la expresion. Como ya no queda mas es sabemossacan y sela si pila, tiene Todos se prioridad aaden a la guardarlo mayor definitivamenteel * aahora, el de El es prioridad hastatodos Podemos nueva expresinnueva aadir de la As termina la conversin mayor prioridad, debemos recordarlo aun. Mejor guardarlo expresion, y olvidarnos de el
* + -
CONVERSION: ALGORITMO
Cada smbolo de la expresin es revisado Si el smbolo es un operando,
Se aade a la expresin
Si el smbolo es un operador
El smbolo es evaluado con respecto a su prioridad Si tiene mayor prioridad que el ultimo operador almacenado
Aun no se puede decir nada, y se recuerda, es decir, se almacena en un pila
Si tiene menor prioridad que el ultimo operador almacenadoQuiere decir, que el ultimo operador almacenado es el de mayor prioridad sin lugar a dudas El ultimo operador almacenado, se saca y se aade a la nueva expresin Esto sigue hasta que el operador que estamos revisando sea el de mayor prioridad de todos los almacenados en la pila
Una vez revisados todos los smbolos de la expresin
Si hay algo almacenado en la pila, se saca y se aade a la nueva expresin
EN PSEUDOCODIGOPila s; PilaVacia(&s); while(no termine la expresion en infija) { simbolo = siguiente carcter de entrada; if(simbolo es un operando) else{
aadir simbolo a la nueva expresion posfijawhile(simbolo tenga menor o igual precedencia que el tope de la pila) { simb_tope = pop(s); } push(s,simbolo)
aadir simb_tope a la nueva exp.
} /*le da salida a los operadores restantes*/ while(!EstaVacia(s)){ simb_tope = pop(s); }
}
aadir simb_tope a la nueva exp. posfija
Y CON PARENTESIS
Lo anterior, es valido para conversin de expresiones sin parntesisPara resolver este problema, podemos seguir las siguientes reglas:
Los parntesis izquierdos (
Siempre van a ser aadidos a la pila, pase lo que pase
Los parntesis derechos )
Significa que un ambiente de () ha sido terminado,Todos los operadores de la pila, se sacan, hasta encontrar un (
CON PARENTESIS: ALGORITMOPila s; PilaVacia(s); while(no termine la expresion en infija){ simbolo = siguiente carcter de entrada; if(simbolo es un operando) else{ if(simbolo == )){ while(TRUE){ simb_tope = pop(s); if (simb_tope == ) || EstaVacia(s)) break; } } else if(simbolo != (){ while(simbolo tenga menor o igual precedencia que el tope de la pila ) simb_tope = pop(s); } } push(s,simbolo)
aadir simbolo a la nueva expresion posfija
aadir simb_tope a la nueva exp.
aadir simb_tope a la nueva exp.
} /*le da salida a los operadores restantes*/ while(!EstaVacia(s)){ simb_tope = pop(s); }
}
aadir simb_tope a la nueva exp. posfija
EJERCICIO EN CLASE
Usando el algoritmo, convertir((A-(B+C))*D^(E+F) ABC+-D*EF+^
Top Related