10. Aplicaciones de Las Pilas

download 10. Aplicaciones de Las Pilas

of 14

Transcript of 10. Aplicaciones de Las Pilas

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+^