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

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 popular


No es la nica forma, hay dos mas

Convertir operacin por operacin


A+(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 parntesis


En 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: ALGORITMO
Podra 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 operador


Los 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 PSEUDOCODIGO
Pila 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 POSFIJA


A 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 operador. podemos continuar. Seguimos Comparado con el de mayor * Es un Si se + es un operador, pero, Aqu terminamos de revisar la comparando hasta el con ahora(el el de mayor *), prioridad prioridad el compara con el ultimo hasta lo mayor que vamos expresin, smbolo por smbolo. hasta ahora, el +. Como elprioridad. no tiene mayor no tiene recordado, el * tiene En la pila, quedan aun revisando, no es el de prioridad que el +, el + ya puede ser aadido Ahora si podemos decir, que el * mayor prioridad. Pero no operadores. mejor, amayor la expresion. Como ya no queda mas en la es el prioridad, operador de mayor sabemos si pila, tiene Todos se sacan y sela aaden a la prioridad guardarlo nueva mayor prioridad de todos El es definitivamente hasta ahora, el de Podemos aadir expresin el *a la nueva As termina la conversin mayor Mejor prioridad, debemos recordarlo aun. 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 almacenado


Quiere 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 PSEUDOCODIGO
Pila 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 posfija


while(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 parntesis


Para 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: ALGORITMO


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

Вам также может понравиться