mod ayed tema 7
DESCRIPTION
Tema 7 de Algoritmos y Estructuras de datosTRANSCRIPT
“Tema 7. Pilas y Colas (Stack and Queues)”
UNIVERSIDAD AUTONOMA GABRIEL RENE MORENOFACULTAD DE CIENCIAS EXACTAS Y TECNOLOGIAS
Carrera de Ingeniería Informática
Docente: Ing. Ubaldo Pérez Ferreira
E-mail: [email protected]
Seminario de Grado
Modulo: Algoritmos y Estructura de Datos
Santa Cruz de la Sierra – Bolivia © 2008
Abstracción
• Abstraer: Eliminar lo irrelevante y quedarnos con lo realmente importante.
• ¿Qué es lo importante?– En cada parte del trabajo puede serlo cosas
distintas
• Para llevar a cabo la abstracción los lenguajes nos proporcionan mecanismos:– Módulos, clases, genericidad, ocultación,
encapsulación, ...
Abstracción
• El diseño de programas está basado en el uso de abstracciones. Se trata de:
• 1. Identificar los subproblemas.• 2. Especificación abstracta de cada uno de
ellos.• 3. Implementar cada abstracción.• 4. Verificación del programa.
Especificaciones informales.
La descripción de una abstracción se realiza con un lenguaje natural (ambiguas e imprecisas).
Notación de espeficicación:Partes que debe tener la especificación,
Significado y tipo de cada parte,
Partes que pueden ser opcionales, ...
Especificaciones informales.
• Notación• Operación <nombre> (ent <id>: <tipo>;...; sal
<tipores>)
– Requiere: establece restricciones de uso.– Modifica: identifica los datos de entrada que se
modifican.– Calcula: descripción textual del resultado de la
operación.– Requiere y Modifica, y los parámetros de entrada y
salida son opcionales.– Puede ser parametrizada:– Operación <nombre> [<id>:<tipo>;...] (...
Especificaciones informales.
Ejemplo: concatenar dos cadenas.
– Operación concat (ent a,b: cadena; sal c: cadena)
– Calcula: la cadena de salida c es una nueva cadena que contiene los caracteres de a (en el mismo orden) seguidos de los caracteres de b (en el mismo orden).
Especificaciones Formales.
Notación
La descripción formal constará de cuatro partes:
NOMBRE. Nombre genérico del TAD.
CONJUNTOS. Conjuntos de datos que intervienen en la definición.
SINTAXIS. Signatura de las operaciones definidas.
<nombre_operación> : <conj_dominio> <conj_resultado>
SEMÁNTICA. Indica el significado de las operaciones.
Especificaciones Formal – Numeros Naturales
NOMBRE natural• CONJUNTOS N conjunto de naturales, B conjunto de valores booleanos• SINTAXIS• cero: N• sucesor: N N• escero: N B• igual: N x N B• suma: N x N N• SEMANTICA m, n N• 1. escero (cero) = true• 2. escero (sucesor (n)) = false• 3. igual (cero, n) = escero (n)• 4. igual (sucesor (n), cero) = false• 5. igual (sucesor (n), sucesor (m)) = igual (n, m)• 6. suma (cero, n) = n• 7. suma (sucesor (m), n) = sucesor (suma (m, n))
Funciones
Axiomas
Especificación Formal - Arreglos
Structure Array(Value,index)
Declare Create() Array
Retrive(Array,Index) Vakue
Store(Array,Index,Value) Array
Swap(Array,Index,Index) Array
Equal(index,index) Bolean
A N i , j Index, x Value
Retrieve(Create,i)::= error
Retrieve(Store(A,i,x),j)::=
If Equal(i,j) Then x Else Retrieve(A,j)
F
A
Funciones
Axiomas
Especificación Formal – TAD Polinomios
P(x) = 5x3 + 3x2 – 2x + 2
Operaciones
Evaluar P(2) = 50
Operaciones Binarias: C, P, Q Polinomios
C(x) = P(X) + Q(X)
Especificación Formal – TAD Polinomios
Structure Polinomio
Declare Zero() Poly //Define polinomio
Iszero(Poly) Boolean //Esta vació el Polinomio
Coef(Poly, exp) coef //Obtiene el coef. del Polinomio
Attach(Poly, coef, exp) Poly //Adiciona un elemento al Polinomio
Rem(Poly, exp) Poly //Elimina un elemento del Polinomio
Smult(Poly, coef, exp) Poly // Multiplicación por un monomio
Add(Poly, Poly) Poly //Adición de Polinomios
Mult(Poly, Poly) Poly //Multiplicación de Polinomios
F
Podemos Especificar un TAD para los Polinomios
Especificación Formal – TAD Polinomios
P,Q Poly c , d coef, e,f exp
Rem(Zero, f)::= Zero
Rem( Attach( P, c, e ),f)::=
If e=f Then Rem(P,f) Else Attach(Rem(P,f),c,e)
Iszero(Zero)::=true
Iszero(Attach(P,c,e))::= If Coef(P,e)=-c then Iszero(Rem(P,e)) else false
Coef(Zero,e)::=0
Coef(Attach(P,c,e),f)::= If e=f then c + Coef(P,f) else Coef(P+f)
Smult(Zero,d,f)::=Zero
Smult(Attach(P,c,e),d,f)::= Attach(Smult(P,d,f), cxd, e+f)
Add( P, Zero )::=P
Add(P,Attach( Q,d,f))::=Attach(Add(P,Q),d,f)
Mult(P,Zero)::=Zero
Mult(P,Attach(Q,d,f))::= Add(Mult(P,Q),Smult(P,d,f)
A
Ejercicio de Especificación Formal – TAD Polinomios
Dado el Polinomio P(x)= 3x6+2x4+3 y el polinomio Q(x)=3x-1 cual es el resultado de aplicar las siguientes expresiones utilizando las Funciones y Axiomas del TAD Polinomio
Rem(P, f)
Rem(Attach(P,-8,5,),0)
Iszero(Attach(P,0,0))
Smult(Zero,3,6)
Smult(Attach(P,2,2),1,1)
Attach(Smult(P,1,1), 1*2, 2+1)
Add( P, Zero )
Add(P,Attach( P,3,2))
Attach(Add(P,Q),3,2)
Mult(P,Zero)
Mult(P,Attach(Q,4-2,3))
Add(Mult(P,Q),Smult(P,4-2,3)
Ejercicio de Especificación Formal – TAD Polinomios
Dado el Polinomio P y Q, diseñar el algoritmo para sumar dos polinomios (AddPoly), utilizando las Funciones y Axiomas del TAD Polinomio. Se debe considerar la función Exp(Poly) la misma que obtiene el grado de un polinomio o exponente mayor.
Procedurre AddPoly()C= ZeroWhile NOT (IsZero(A) and IsZero(B)) do
Case:Exp(A)<Exp(B)
C=Attach(C, Coef(B,Exp(B)),Exp(B))B=Rem(B,Exp(B))
:Exp(A)>Exp(B)
C=Attach(C,Coef(A,Exp(A)),Exp(A))
A=Rem(A,Exp(A)):Exp(A)=Exp(B)
C=Attach(C,Coef(A,Exp(A))+ Coef(B,Exp(B)),,Exp(A))
A=Rem(A,Exp(A))B=Rem(B,Exp(B))
End CaseEnd while
TAD – PILAS (Stacks)
Ilustración
Vehículos en un calle sin salida
A1A2A3A4
Descripción. Una pila es una lista especial en la cual todas las inserciones y eliminaciones tiene lugar en un extremo denominado Tope.
Tope
Es una lista de tipo LIFO (Last-in First-out)
Especificación Informal del TAD – PILAS (Stacks)
Sea S una Pila, a menudo se incluye las siguientes operaciones
Create(S)
Drop(S)
Top(S)
Delete(S)
Vacia(S)
Add(i, S)
Creas una Pila S, se debe asegurar que S no exista.
Destruye la Pila S, es decir la Pila ya no existe.
Toma el elemento Tope de la Pila, sin sacarlo de ella, la Pila S debe existir y ≠ 0 .
Elimina el elemento Tope de la Pila, la Pila S debe existir y ≠ 0 .
Devuelve TRUE si S no contiene elemento, de lo contrario FALSE.
Inserta el elemento i en la parte superior de S, el anterior Tope se convertirá en el siguiente elemento. La Pila S debe existir.
Especificación Forma del TAD – PILAS (Stacks)
Structure Stack(item)
Declare Create() Stack
Add(item, Stack) Stack
Delete(Stack) Stack
Top(Stack) item
Vacia(Stack) Bolean
s Stack i Item
Vacia(Create(S))::= error
Vacia(Add(i,S))::= false
Delete(Create(S))::=error
Top(Create(S))::=error
Top(Add(i,S))::=i
F
A
Funciones
Axiomas
D= stack, item,boolean
Pila= D, F , A
Implementación de TAD – PILAS usando vectores
top=0
1 2 … max
Const
max = 100
Type
Pila = record
elemento: Array[1..max] of tipo_elemento
top :int
End record
Implementación de TAD – PILAS usando vectores
Function Create(var P: Pila)
P.tope=0
End function
Function Drop(var P:Pila)
P.top=0
End Function
Function Vacia(var P: Pila): boolean
if P.top=0 then
Vacia = True
return
else
Vacia=false
return
end if
End function
Function Top(var P:Pila): Tipo_elemento
Top=P.elemento[P.top]
End Function
Implementación de TAD – PILAS usando vectores
Function Add(var E:Tipo_elemento, P: Pila)
P.top=P.top + 1
P.elemento[P.top]=E
End function
Function Delete(var P:Pila)
P.top=P.top - 1
End Function
TAD – COLAS (Queue)
Ilustración
Vehículos en una gasolinera
A1A2A3A4
Descripción. Una cola es una lista especial en la cual los elementos son insertados en un extremo (posterior, rear) y son eliminados en el otro extremo (frente, front) .
Front
(Elimina) Es una lista de tipo FIFO (First-in First-out)
Rear
(Inserta)
Especificación Informal del TAD – COLA
Sea Q una Cola, a menudo se incluye las siguientes operaciones
Create(Q)
Drop(Q)
Front(Q)
Delete(Q)
Vacia(Q)
Add( Q, E)
Creas una cola Q, se debe asegurar que Q no exista.
Destruye la Cola Q, es decir Q ya no existe.
Toma el primer elemento de Q, sin sacarlo de ella, Q debe existir y ≠ 0 .
Elimina el elemento del Front de Q, además Q debe existir y ≠ 0 .
Devuelve TRUE si Q no contiene elemento, de lo contrario FALSE.
Inserta el elemento E en la parte posterior de Q.
Especificación Forma del TAD – COLA
Structure Cola(item)
Declare Create() Cola
Add(item, Cola) Cola
Delete(Cola) Cola
Front(Cola) Cola
Vacia(Cola) Bolean
FFunciones
Especificación Forma del TAD – COLA
Q Stack i Item
Vacia(Create(Q))::= true
Vacia(Add(i,Q))::= false
Delete(Create(Q))::=error
Delete(Add,(i,Q))::=if Vacia(Q) then Create(Q) else Add(i,delete(Q))
Front(Create(Q))::=error
Front(Add(i,Q))::=if Vacia(Q) then i else Front(Q)
A
Axiomas
D= cola, item, boolean Cola= D, F , A
Implementación de TAD – COLA usando vectores
top=0
1 2 … max
Const
max = 100
Type
Cola = record
elemento: Array[1..max] of tipo_elemento
rear :int
front :int
End recor
Q
Implementación de TAD – COLA usando vectores
Function Create(var Q: Cola)
Q.tope = 0
Q.front = 0
End function
Function Drop(var Q:Cola)
Q.tope = 0
Q.front = 0
End Function
Function Vacia(var Q: Cola): boolean
if Q.front = Q.rear then
Vacia = True
else
Vacia=false
end if
End function
Function Front(var Q:Cola): Tipo_elemento
If Vacia(Q) then
error “Cola vacia”
else
Front=Q.elemento[Q.front + 1]
end if
End Function
Implementación de TAD – COLA usando vectores
Function Add(var i:Tipo_elemento, Q: Cola)
if Q.rear = max then
Mensaje “Pila llena”
else
Q.rear = Q.rear + 1
Q.elemento[Q.rear] = i
end if
End function
Function Delete(var Q:Cola)
if Q.front = Q.rear then
Mensaje “Pila vacia”
else
Q.front = Q.front + 1
end if
End Function
Implementación de TAD – COLA CIRCULAR usando vectores
front=rear=max
1 2 … max
Existe un problema cuando rear = max, ya no se pueden adicionar mas datos
Q
01
2
n-1n-2
n-3
Solucion PILA CIRCULAR!!!
Estado inicial de la Cola Q
Implementación de TAD – COLA CIRCULAR usando vectores
01
2
n-1n-2
n-3
Otra forma de hacer girar la COLA
(Q.rear + 1) mod n // para el rear
(Q.Front + 1) mod n // para front
Para que gire la COLA
If Q.rear = n-1 then
Q.rear = 0
Else
Q.rear=Q.rear + 1
End if
Implementación de TAD – COLA CIRCULAR usando vectores
Function Add(var i:Tipo_elemento, Q: Cola)
Q.rear = (Q.rear + 1) mod n
if Q.front = Q.rear then
Mensaje “Pila llena”
else
Q.elemento[Q.rear] = i
end if
End function
Function Delete(var Q:Cola)
if Q.front = Q.rear then
Mensaje “Pila vacia”
else
Q.front = (Q.Front + 1) mod n
end if
End Function
Los Algoritmos Add y Delete quedarian de la siguiente manera
Al ejecutar Add y Delete nos econtramos con un problema cuando Q.front = Q.rear ¿Esta llena o vacía la Cola?
Implementación de TAD – COLA CIRCULAR usando vectores
Function Add(var i:Tipo_elemento, Q: Cola)
if Q.c=n then
Mensaje “Cola llena”
else
Q.rear = (Q.rear + 1) mod n
Q.elemento[Q.rear] = i
Q.c = Q.c + 1
end if
Const
max = 100
Type
Cola = record
elemento: Array[1..max] of tipo_elemento
rear: int
front: int
c: int
End recor
Mejorando los algoritmos Add y Delete cuando Q.front=Q.rear, se adiciona un contador c
Hacer la prueba de escritorio!!!!
Function Delete(Q: Cola)
if Q.c=0 then
Mensaje “Cola vacio”
else
Q.front = (Q.front + 1) mod n
Q.elemento[Q.rear] = i
Q.c = Q.c - 1
end if
MULTIPLES PILAS y COLAS
Respuestas: Definir tal vez tantas pilas y colas se requieran
S1(1:n1)
S2(1:n2)
Q1(1:n1) y un conjunto de funciones para cada una
¿Que pasa si se requiere mas de una Pila o mas de una Cola o ambas ?
top1=0
1 2 … n1 S1
top2=0
1 2 … n2
S2
Ejemplo para dos Pilas
1 2 … m
V
top1=0 top2=0
Para desarrollar
¿Cuándo esta vacia? If top1, top2 = 0
¿Cuándo esta llena? If top1+1 = top2
¿Cómo hacer las funciones Add y Delete?
a) b)
MULTIPLES PILAS y COLAS
Que sucede si queremos alamcenar n Pilas
1 2 … m
V
S1 s2 … Sn
1≤i≤n
El tamaño de cada pila Si será │m/n │
Se utilizaran dos arreglos adicionales
B(1:n+1) para almacenar el inicio y el fin de las pilas
Si = B(i) a B(i+1) tamaño de cualquier Si
T(1:n+1) para almacenar el estado del puntero Top de cada pila Si
Al crear las n pilas el estado de B y T sera:
B(i) = T(i) = │m/n │(i-1) 1≤i≤n
Para B(n+1) = m por si existe division fragmentada de │m/n │
MULTIPLES PILAS y COLAS
Algunas consultas sobre multiples Pilas
¿Cuál es el espacio libre de cualquier pila Si?
Xi = B(i+1) – T(i)
¿Cuál es el espacio disponible en toda la lista V?
ed = ∑¿Cuántas celdas ocupadas existen V?
edv = m – ed
¿Cuándo esta vacia una pila Si?
if T(i) = B(i) then
¿Cuándo esta vacia una pila Si?
if T(i) = B(i+1) then
n
i=1
Xi
MULTIPLES PILAS y COLAS
Los algoritmos para Add y Delete para multiples Pilas
Add(x,i)
if T(i) = B(i+1) then
mensaje “pila llena”
else
T(i) = T(i) + 1
V(T(i)) = x
end if
Delete(i)
if T(i) = B(i) then
mensaje “pila vacia”
else
T(i) = T(i) - 1
end if
n
i=1
Xi
Desarrolle Múltiples Colas!!!!!
Implementar Add y Delete
Que pasa si tengo Cola Circular