10. aplicaciones de las pilas

andreitaenriquez92 5,843 views 14 slides Jun 04, 2013
Slide 1
Slide 1 of 14
Slide 1
1
Slide 2
2
Slide 3
3
Slide 4
4
Slide 5
5
Slide 6
6
Slide 7
7
Slide 8
8
Slide 9
9
Slide 10
10
Slide 11
11
Slide 12
12
Slide 13
13
Slide 14
14

About This Presentation

No description available for this slideshow.


Slide Content

APLICACIONES DE PILAS
Estructuras de Datos

EXPRESIONES
Una expresión aritmética:
Conjunto de operadores, variables y paréntesis. Ejemplo:
A+B
Esta forma de escribir las expresiones: NOTACION INFIJA
El operador siempre va en medio de los operandos
En una expresión, 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:
Paréntesis : () Mayor prioridad
Potencia : ^
Multiplicación/división:*,/
Suma/Resta : +,-* Menor Prioridad

NOTACIONES
La notación infija es la mas popular
No es la única forma, hay dos mas
NOTACION PREFIJA(POLACA)
+ABAquí el operador va antes que los
operandos
NOTACION POSFIJA(POLACA INVERSA)
AB+Aquí el operador va después que
los operandos
No son nada difíciles, pero
Siempre tener en cuenta la precedencia de
los operadores
Ejemplo. Pasar a postfija las siguientes
expresiones:
Agrupar como establece la precedencia
(A+B)*C
Convertir operación por operación
La de mayor precedencia primero
(AB+)*C
La que le sigue en precedencia
(AB+)C*
Remover Paréntesis
AB+C*
Ya no se necesitan
paréntesis
En postfija, el orden de los
operadores es el verdadero
orden de ejecución
A+B*C
(A+B)*C
Agrupar como establece la precedencia
A+(B*C)
Convertir operación por operación
La de mayor precedencia primero
A+(BC*)
La que le sigue en precedencia
A(BC*)+
Remover Paréntesis
ABC*+

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*
ABC*+
A+B -> 7
7*C -> 35
B*C -> 20
20+A -> 23
7C*
A20+

EVALUACION: ALGORITMO
Con lo anterior, ya tenemos una idea de que hacer
Deberíamos 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 operación, debe ser también “recordado”
Así, hasta que la expresión termine
Podría ser un una pila
2 veces Pop
Push del
resultado en
la pila
ABC*+ C*B+A
A
B
C
C*B

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 operación simbolo entre
operando1 y operando2
Push(s,valor);
}
}
return(Pop(s));

EJERCICIO EN CLASE
Dada la siguiente expresión:
6 2 3+ - 3 8 2 / + * 2 ^ 3 +
Simule la pila, para evaluar esta expresión

CONVERSION DE INFIJA A
POSFIJA
A + B * C - D A B C * + D -
El operador de mayor
precedencia en la expresión
será el primero en aparecer en
la conversión
A
El operador de
mayor
precedencia es el
primero en
aparecer en la
expresión
A es un operando,
es añadido
directamente a la
nueva expresión en
postfija
+
+ es un operador, pero,
hasta lo que vamos
revisando, no es el de
mayor prioridad, mejor,
guardarlo
* Es un operador. Si se
compara con el ultimo
recordado, el * tiene
mayor prioridad. Pero no
sabemos si tiene “la”
mayor prioridad de todos
aun. Mejor guardarlo
*
Comparado con el de mayor
prioridad hasta ahora(el *), el –
no tiene mayor prioridad.
Ahora si podemos decir, que el
* es el operador de mayor
prioridad
Podemos añadir el * a la nueva
expresion, y “olvidarnos” de el
Pero aun no podemos continuar. Seguimos
comparando el – con el de mayor prioridad
hasta ahora, el +. Como el – no tiene mayor
prioridad que el +, el + ya puede ser añadido
a la expresion. Como ya no queda mas en la
pila,
El – es definitivamente hasta ahora, el de
“mayor prioridad”, debemos recordarlo
-
Aquí terminamos de revisar la
expresión, símbolo por símbolo.
En la pila, quedan aun
operadores.
Todos se sacan y se añaden a
la nueva expresión
Así termina la conversión
B C * + D -

CONVERSION: ALGORITMO
Cada símbolo de la expresión es revisado
Si el símbolo es un operando,
Se añade a la expresión
Si el símbolo es un operador
El símbolo 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 añade a la nueva expresión
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 símbolos de la expresión
Si hay algo almacenado en la pila, se saca y se añade a la nueva expresión

EN PSEUDOCODIGO
Pila s;
PilaVacia(&s);
while(no termine la expresion en infija)
{
simbolo = siguiente carácter de entrada;
if(simbolo es un operando)
añadir simbolo a la nueva expresion posfija
else{
while(simbolo tenga menor o igual precedencia que el tope de la pila)
{
simb_tope = pop(s);
añadir simb_tope a la nueva exp.
}
push(s,simbolo)
}
}
/*le da salida a los operadores restantes*/
while(!EstaVacia(s)){
simb_tope = pop(s);
añadir simb_tope a la nueva exp. posfija
}

Y CON PARENTESIS
Lo anterior, es valido para conversión de expresiones sin
paréntesis
Para resolver este problema, podemos seguir las siguientes
reglas:
Los paréntesis izquierdos (
Siempre van a ser añadidos a la pila, pase lo que pase
Los paréntesis 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 carácter de entrada;
if(simbolo es un operando)
añadir simbolo a la nueva expresion posfija
else{
if(simbolo == ‘)’){
while(TRUE){
simb_tope = pop(s);
if (simb_tope == ‘)’ || EstaVacia(s)) break;
añadir simb_tope a la nueva exp.
}
}
else if(simbolo != ‘(‘){
while(simbolo tenga menor o igual precedencia que el tope de la pila)
simb_tope = pop(s);
añadir simb_tope a la nueva exp.
}
}
push(s,simbolo)
}
}
/*le da salida a los operadores restantes*/
while(!EstaVacia(s)){
simb_tope = pop(s);
añadir simb_tope a la nueva exp. posfija
}

EJERCICIO EN CLASE
Usando el algoritmo, convertir
((A-(B+C))*D^(E+F)
ABC+-D*EF+^
Tags