Curso
Curso
Pilas – Colas
Primer Semestre,
2010
Indice
• TDA: Pilas
• TDA: Colas
• Colas de Prioridad
• Anillos
• BiColas
• BiColas Circulares
Pilas - Stack
LIFO
Entrada
Salida
trabajos
Universidad Técnica Federico Santa María - Departamento de Informática
Pilas - Stack
LIFO
Entrada
Salida
trabajos
Aplicaciones Directas:
• Histórico de páginas visitadas en un browser de web.
• Secuencia de “undo” en un editor de textos.
• Cadena de llamadas a métodos en JVM o medioambiente
runtime en C++
• Parsers en Compiladores (reconocedores sintácticos).
• SSOO.
• Convertir notación infija a posfija o prefija.
• Implementación de recursividad.
Aplicaciones Indirectas:
• Estructuras de datos auxiliares para algoritmos
• Componentes de otras estructuras de datos.
* 4
- 2 - 8
3 3 5
+ 1 + 1 + 1 9
Iteración 1 Iteración 2 Iteración 3
• Operaciones:
• CrearPilaVacía( P ) apilar desapilar
• PilaVacía( P ) → B tope
• Apilar( x, P )
• Desapilar( P )
• Tope( P ) → E
•• CrearPilaVacía: Pila→→Pila
CrearPilaVacía:Pila Pila
•• CrearPilaVacía(P)
CrearPilaVacía(P)==CrearListaVacía(P)
CrearListaVacía(P)
•• Invocación:
Invocación:CrearPilaVacía(P)
CrearPilaVacía(P)
•• PilaVacía: Pila→→Lógico
PilaVacía:Pila Lógico
•• PilaVacía(P)
PilaVacía(P)==ListaVacía(P)
ListaVacía(P)
•• Invocación:
Invocación:PilaVacía(P)
PilaVacía(P)
•• Apilar:
Apilar:Elemento Pila→→Pila
ElementoxxPila Pila
•• Apilar(
Apilar(x,x,PP))==Insertar(
Insertar(x,x,Primera(P),
Primera(P),PP))
•• Invocación:
Invocación:Apilar(x,P)
Apilar(x,P)
Universidad Técnica Federico Santa María - Departamento de Informática
•• Desapilar: Pila→→Pila
Desapilar:Pila Pila
Desapilar(
Desapilar(PP)){{
Si
Si(no
(noListaVacía(P))
ListaVacía(P))
Eliminar(
Eliminar(Primera(P),
Primera(P),PP))
sino
sinoError
Error
}}
•• Invocación:
Invocación:Despilar(P)
Despilar(P)
•• Tope: Pila→→Elemento
Tope:Pila Elemento
Tope(
Tope(PP)) {{
Si
Si(no
(noListaVacía(P))
ListaVacía(P))
Retornar(
Retornar(Recuperar(Primera(P),
Recuperar(Primera(P),P)
P)))
Sino
Sino Error
Error
}}
•• Invocación:
Invocación:Tope(P)
Tope(P)
void
voidMostrarPila(Pila
MostrarPila(Pila P) P){{
Pila p1;
Pila p1;
CrearPilaVacia(
CrearPilaVacia(p1 p1))
PasarPila(
PasarPila(P,
P,p1
p1)) ////definirla
definirla
mientras
mientrasno
noPilaVacia(
PilaVacia(p1p1)){{
Imprimir(
Imprimir(Tope(p1)
Tope(p1)))
Apilar(
Apilar( Tope(p1),PP))
Tope(p1),
Desapilar(
Desapilar(p1p1))
}}
}}
Universidad Técnica Federico Santa María - Departamento de Informática
Pila
PilaPasarPila(
PasarPila(Pila
PilaOrigen
Origen)) {{
Pila
PilaDest;
Dest;
mientras
mientras(no
(noPilaVacia(
PilaVacia(Origen
Origen))))
Apilar(
Apilar(Tope(Origen),
Tope(Origen),Dest
Dest))
Desapilar(
Desapilar(Origen
Origen))
}}
return
returnDest;
Dest;
}}
PILAS
tope
...
NULL
PILAS – Implementaciones
tope a1 a2 …. an
pila
Universidad Técnica Federico Santa María - Departamento de Informática
PILAS – Implementaciones
boolean
booleanEstaVacia
EstaVacia(struct
(structnodoP*
nodoP*tope)
tope) {{
return (tope→
return(tope →sigsig====NULL);
NULL);
////Verdadero
Verdaderosisiestá
estávacía
vacía
}}
PILAS – Implementaciones
void
voidPush
Push(tElemento
(tElementox,
x,struct
structnodoP*
nodoP*tope)
tope) {{
struct
structnodoP*
nodoP*q; q;
qq==(struct
(structnodoP*)
nodoP*)malloc
malloc(sizeof
(sizeof(struct
(structnodoP));
nodoP));
qq→→info
info==x;x; ////almacena
almacenaelelelemento
elemento
qq→→sigsig==tope;
tope; ////enlaza
enlazaalalnodo
nodoconconelelresto
resto
tope
tope==q;q; ////yylo
lopone
poneen enlalacabeza
cabeza
}}
PILAS – Implementaciones
tElemento
tElementoPop Pop(struct
(structnodoP*
nodoP*tope)
tope) {{
struct
structnodoP*
nodoP*temp;
temp;
tElemento
tElementox; x;
ifif(EstaVacía(tope))
(EstaVacía(tope))
printf
printf(“Error:
(“Error:pila
pilavacía”);
vacía”);
else
else {{
tope→
xx==tope →info;
info;
temp
temp==tope;
tope; ////Se
Seeliminará
eliminaráeleltope
tope
tope tope→
tope==tope →sig;
sig;
free(temp);
free(temp);
return(x);
return(x);
}}
}}
Universidad Técnica Federico Santa María - Departamento de Informática
Ejemplo
1000 1
10 10 10 10 10 10
2∗a
(b + (b^2 – 4 * a * c) ^ 0.5) / (2 * a)
6 1 4 2 3 5 8 7
Universidad Técnica Federico Santa María - Departamento de Informática
Notación postfija
Notación postfija
• Ecuación cuadrática −b ± b 2 − 4 ∗ a ∗ c
2∗a
• En notación infija:
( -b + ( b ^ 2 – 4 * a * c ) ^ ( 1 / 2 ) ) / ( 2 * a )
• En notación postfija:
-b b 2 ^ 4 a c * * – 1 2 / ^ + 2 a * /
Algoritmo
1. Implementar la pila
2. Repetir hasta encontrar el fin de la expresión postfija
• Tomar un carácter.
• Si el carácter es un operando colocarlo en la pila.
• Si el carácter es un operador entonces sacar los dos
valores del tope de la pila (operando2 operando1), aplicar
el operador (operando1 operador operando2) y colocar el
resultado en el nuevo tope de la pila.
nodoP
nodoPInvPila(nodoP
InvPila(nodoP*tope)
*tope) {{
//// Función
Funciónque
queinvierte
invierteuna
unapila
pila
tElemento
tElementox;x;
nodoP
nodoP*tope1;
*tope1;
while(
while(!EstaVacia(tope)
!EstaVacia(tope))) {{
xx==Pop(tope);
Pop(tope);
Push(x,
Push(x,tope1);
tope1);
}}
return(tope1);
return(tope1);
}}
Implementación en C
#include
#include<stdlib.h>
<stdlib.h>
#include
#include<stdio.h>
<stdio.h>
typedef
typedefstruct
structnodoP
nodoP{{
int
intvalor;
valor;
struct
structnodoP
nodoP*sig;
*sig;
}}tipoNodo;
tipoNodo;
typedef
typedeftipoNodo
tipoNodo*pNodo;
*pNodo;
typedef
typedeftipoNodo
tipoNodo*Pila;
*Pila;
////Prototipo
Prototipode
delas
lasfunciones
funciones
void
voidPush(Pila
Push(Pila*p,
*p,int
intx);
x);
int
intPop(Pila
Pop(Pila*p);
*p);
Ejemplo
leer n;
mientras n > 1 {
push(n);
n = n-1;
}
factorial = 1;
mientras pila no está vacía
factorial = factorial * pop();
Universidad Técnica Federico Santa María - Departamento de Informática
Ejercicios
b) EstaVacia(Pop(Pop(Push( 8,p))))
2. Escribir una función que permita contar todos los elementos pares que
están en una pila dada.
COLAS
COLAS
Colas - queue
• Es una abstracción útil con muchos paralelismos en la vida
real: colas de espera en bancos, supermercados, etc
• Ello hace que su importancia sea crucial en simulaciones.
• Computacionalmente hay muchos casos en los que aparecen
colas de espera, por ejemplo:
• Procesos que esperan a ser ejecutados en sistemas
multitarea
• Procesos batch de cálculo intensivo
• Acceso a recursos compartidos (impresora)
Universidad Técnica Federico Santa María - Departamento de Informática
Colas - queue
Aplicaciones Indirectas:
Colas
• Tipo de dato lineal con estructura FIFO (First In, First Out),
indica que el primer elemento que se incorporó a la estructura,
será el primero que salga, y el único que se puede consultar en
un momento dado.
entrada FIFO
trabajos
salida
Colas
trabajos
salida
Universidad Técnica Federico Santa María - Departamento de Informática
encolar
• CrearColaVacía( C )
final
• ColaVacía( C ) → B
• PonerEnCola( x, C )
• SacarDeCola( C )
frente
• Frente( C ) → E
desencolar
•• CrearColaVacía: Cola→→Cola
CrearColaVacía:Cola Cola
CrearColaVacía(C)
CrearColaVacía(C)==CrearListaVacía(C)
CrearListaVacía(C)
•• Invocación:
Invocación:CrearColaVacía(C)
CrearColaVacía(C)
•• ColaVacía: Cola→→Lógico
ColaVacía:Cola Lógico
ColaVacía(C)
ColaVacía(C)==ListaVacía(C)
ListaVacía(C)
•• Invocación:
Invocación:ColaVacía(C)
ColaVacía(C)
•• PonerEnCola:
PonerEnCola:Elemento Cola→→Cola
ElementoxxCola Cola
PonerEnCola(
PonerEnCola(x,x,CC))==Insertar(
Insertar(x,x,Fin(C),
Fin(C),CC))
•• Invocación:
Invocación:PonerEnCola(x,
PonerEnCola(x,C)
C)
•• SacarDeCola: Cola→→Cola
SacarDeCola:Cola Cola
SacarDeCola(
SacarDeCola(CC)){{
Si
Si(no
(noListaVacía(C))
ListaVacía(C))
Eliminar(
Eliminar(Primera(C),
Primera(C),CC))
sino
sinoError
Error
}}
•• Invocación:
Invocación:SacarDeCola
SacarDeCola(C)
(C)
Universidad Técnica Federico Santa María - Departamento de Informática
•• Frente: Cola→→Elemento
Frente:Cola Elemento
Frente(
Frente(CC)){{
Si
Si(no
(noListaVacía(C))
ListaVacía(C))
retornar(
retornar(Recuperar(Primera(C),
Recuperar(Primera(C),C)
C)))
Sino
Sino Error
Error
}}
•• Invocación:
Invocación:Frente(C)
Frente(C)
Colas - Implementación
Salida de Dato
Colas
• Representación gráfica:
frente final
...
NULL
Colas
• Otra representación:
Colas
frente
final
NULL
Colas
INSERTAR(dato;frente;final)
INSERTAR(dato;frente;final){{
p
Nuevo(p);
Nuevo(p);
p->info dato
p->info==dato;
dato;
ififfinal
final====NULL
NULL{{ final
frente
frente==p;p; ////1a
1a p 2a
final
final==p;p; ////2a
2a frente dato
3
}} 1a null
else
else{{ final
final->sig
final->sig==p;p; ////1b
1b p 2b
final
final==p;p; ////2b
2b dato
frente final 1b 3
}}
... null
p->sig
p->sig==null;
null; //// 33
}}
Universidad Técnica Federico Santa María - Departamento de Informática
Colas
Algoritmo
AlgoritmoEliminar(frente)
Eliminar(frente)
{{
ififfrente
frente====NULL
NULL frente null
“cola
“colavacía”
vacía”
else
else {{
frente frente final
pp==frente;
frente; //// 11
3 2
frente
frente==frente->sig;
frente->sig; //// 22 ...
free(p);
free(p); //// 33 1
p null
}}
}}
Colas - Implementación
boolean
booleanEstaVacía
EstaVacía(tCola
(tCola**frente,
**frente,tCola
tCola**final)
**final){{
//// Verificación de cola vacía
Verificación de cola vacía
ifif((*final
((*final==
==NULL)
NULL)&& &&((*frente
*frente==
==NULL))
NULL))
return(
return(true);
true); ////Verdadero
Verdaderosisiestá
estávacía
vacía
else
else
return
return(false);
(false);
}}
Colas - Implementación
void
voidEnqueue
Enqueue(tCola
(tCola**frente
**frente,tCola
,tCola**final)
**final){{
tElemento
tElementodato;
dato;
printf("Ingrese
printf("Ingreseelemento
elemento");
"); scanf("%d",&dato);
scanf("%d",&dato);
if(
if(*frente
*frente==
==NULL)
NULL){{
*frente=(tCola *) malloc(sizeof(tCola));
*frente=(tCola *) malloc(sizeof(tCola));
(*frente)->info
(*frente)->info==dato;
dato; ////loslosparéntesis
paréntesisson
sonrequeridos
requeridospor
por
(*frente)->sig
(*frente)->sig==NULL;
NULL; ////precedencia
precedenciadedeoperandos
operandos
*final = *frente;
*final = *frente;
}}
else
else{{
tCola
tCola*q
*q==(tCola
(tCola*)
*)malloc
malloc(sizeof
(sizeof(tCola)
(tCola)););
q->info=
q->info=dato;
dato;
q->sig
q->sig==NULL;
NULL;
*final
*final==(*final)->sig
(*final)->sig==q;
q;
}}
}}
Universidad Técnica Federico Santa María - Departamento de Informática
Colas - Implementación
tElemento
tElementoDequeue
Dequeue(TCola
(TCola**top,
**top,TCola
TCola**final)
**final){{
tCola
tCola*temp;
*temp;
ifif(EstaVacia(frente,final))
(EstaVacia(frente,final))
printf("Error
printf("Error(cola
(colavacia)");
vacia)");
else
else {{
tElemento
tElementox=(*frente)->info;
x=(*frente)->info;
temp
temp==*frente;
*frente;
*frente
*frente==(*frente)->
(*frente)->sig;
sig;
temp->sig=NULL;
temp->sig=NULL;
free(temp);
free(temp);
return(x);
return(x);
}}
}}
Ejemplo
a a
a b a b
a b c a b c
b c b c
Colas - Ejercicios
Escribir
Escribir unauna función
función que,
que, dada
dada una
una cola
cola que
que almacena
almacena números
números
enteros,
enteros,cuente
cuentelalacantidad
cantidadde
demúltiplos
múltiplosdede55que
quecontiene.
contiene.
Solución:
Solución:
int
intMul5EnCola(tCola**frente,
Mul5EnCola(tCola**frente,tCola**final)
tCola**final){{
////Contar
Contarlos losnúmeros
númerosmúltiplos
múltiplosde
de55almacenados
almacenadosen enlalacola
cola
int
intcont=0;
cont=0;
tCola
tCola*aux
*aux=*frente;
=*frente;
while
while(*aux!=
(*aux!=NULL)
NULL){{
int
inttemp
temp==Dequeue(aux,
Dequeue(aux,final);
final);
if(temp
if(temp% %55== ==0)
0)
cont++;
cont++;
}}
return(cont);
return(cont);
}}
Universidad Técnica Federico Santa María - Departamento de Informática
Colas – Ejercicios
#include
#include<stdlib.h>
<stdlib.h>
#include
#include<stdio.h>
<stdio.h>
#include
#include<malloc.h>
<malloc.h>
struct
structtColas
tColas{{
int
intinfo;
info;
struct
structTColas*
TColas*sig;
sig;
};
};
typedef
typedefTColas
TColastCola;
tCola;
void
voidEnqueue(tCola
Enqueue(tCola**frente,
**frente,tCola
tCola**final);
**final);
int
intDequeue
Dequeue(tCola
(tCola**frente,
**frente,tCola
tCola**final);
**final);
int
intMultiplos5EnCola(tCola
Multiplos5EnCola(tCola**frente,
**frente,tCola
tCola**final);
**final);
int
intEstaVacia(tCola
EstaVacia(tCola**final,
**final,tCola
tCola**frente);
**frente);
Colas – Ejercicios
void
voidmain()
main(){{
int
intm5,
m5,i,i,max;
max;
tCola
tCola*final
*final==NULL;
NULL;
tCola
tCola*frente
*frente==NULL;
NULL;
//// Ingresar
Ingresardatos
datosaalalacola
cola
printf("Cuantos
printf("Cuantosdatos
datosaaingresar?
ingresar?");
"); scanf("%d",&max);
scanf("%d",&max);
for(i=0;i < max; i++)
for(i=0;i < max; i++)
Enqueue(&frente,&final);
Enqueue(&frente,&final);
//// Buscar
Buscarlos
losmúltiplos
múltiplosde de55
m5=
m5=Multiplos5EnCola(&frente,
Multiplos5EnCola(&frente,&final);
&final);
printf("\n\nNumeros
printf("\n\nNumerosmultiplos
multiplosde
de5:
5:%d",m5);
%d",m5);
getch();
getch();
}}
1.-
1.- Insertar A A
2.-
2.- Insertar B A B
3.-
3.- Insertar C A B C
4.-
4.- Remover Elemento B C
5.-
5.- Insertar D
B C D
Tipos de colas
• Colas de prioridad
• Anillos
• BiColas
• BiColas circulares
typedef struct {
// Informacion
// Prioridad
Cola *sgte;
} Cola_Prioridad;
P2 I21
P3
ult
P4 I41 I42
Cola
ColaConvertir(
Convertir(Cola
ColaInfija
Infija)) {{
Cola
ColaPost;
Post; Pila
PilaP;
P; Elem
Elemtoken;
token;
CrearPilaVacia(
CrearPilaVacia(PP););
CrearColaVacia(
CrearColaVacia(PostPost););
CrearElem(
CrearElem(token
token););
REPETIR
REPETIR
Asignar(token,
Asignar(token,Frente(Infija)),
Frente(Infija)),
SacarDeCola(
SacarDeCola(Infija
Infija););
Si
SiOperando(
Operando(token
token))
PonerEnCola(
PonerEnCola(token,
token,Post
Post););
Sino
Sino
Si
Si(no
(noPilaVacia(P))
PilaVacia(P))&& && (Prioridad(token)
(Prioridad(token)<=
<=Prioridad(Tope(P)))
Prioridad(Tope(P))){{
PonerEnCola(
PonerEnCola(Tope(P),
Tope(P),Post
Post))
Desapilar(
Desapilar(PP))
}}
Apilar(
Apilar(token,
token,PP););
}}
HASTA
HASTAColaVacia(
ColaVacia(Infija
Infija))
mientras
mientras(no
(noPilaVacia(P))
PilaVacia(P))
PonerEnCola(
PonerEnCola(Tope(P),
Tope(P),Post
Post););
Desapilar(
Desapilar(PP););
}}
return
returnPost;
Post;
}}
Implementación en C – Anillos
• Declaración:
struct tcola {
int clave;
struct tcola *sig;
};
• Creación:
void crear(struct tcola **cola) {
*cola = NULL;
}
Implementación en C – Anillos
• Poner_En_Cola:
void encolar(struct tcola **cola, int elem) {
struct tcola *nuevo;
nuevo = (struct tcola *) malloc(sizeof(struct tcola));
nuevo->clave = elem;
if (*cola == NULL)
nuevo->sig = nuevo;
else {
nuevo->sig = (*cola)->sig;
(*cola)->sig = nuevo;
}
(*cola) = nuevo;
}
Implementación en C – Anillos
• Sacar_De_Cola:
void desencolar(struct tcola **c1, int *elem) {
struct tcola *aux;
*elem = (*c1)->sig->clave;
if ((*c1) == (*c1)->sig) {
free(*c1);
*c1 = NULL;
}
else {
aux = (*c1)->sig;
(*c1)->sig = aux->sig;
free(aux);
}
}
Universidad Técnica Federico Santa María - Departamento de Informática
Implementación en C – Anillos
• Programa de prueba:
#include <stdio.h>
#include <stdlib.h>
int main(void) {
struct tcola *cola;
int elem;
crear(&cola);
if (vacia(cola))
printf("\nCola vacia!");
encolar(&cola, 100);
desencolar(&cola, &elem);
return 0;
}
TAD BiCola
• Las operaciones son las mismas que la del TAD Cola, salvo que
Primero, Insertar y Eliminar son sustituidas por 2 operaciones
respectivamente:
• PrimeroIzquierda: TipoDeque Æ TipoElemento
• PrimeroDerecha: TipoDeque Æ TipoElemento
• InsertarIzquierda: TipoElementox TipoDeque Æ TipoDeque
• InsertarDerecha: TipoElemento x TipoDeque Æ TipoDeque
• EliminarIzquierda: TipoDeque Æ TipoDeque
• EliminarIzquierda: TipoDeque Æ TipoDeque
Universidad Técnica Federico Santa María - Departamento de Informática
BiColas circulares
• Permite la implementación eficiente de todas las operaciones
del anillo normal, y de la cola doble.
• p puede apuntar ahora sin problemas a la cabeza del anillo, ya
que se puede acceder sin problemas y de forma directa al
último elemento.
BiColas circulares
Bibliografía - Webgrafía
• Abstracción de datos
1. http://www14.uniovi.es/tutorED/abstraccion/abstraccionfr.html
• Estructura de Datos
2. http://www14.uniovi.es/tutorED/estlineales/estlineafr.html
3. http://www14.uniovi.es/tutorED/java-c++/java-c++fr.html
4. Como programar en Java. Deitel y Deitel.
• Listas
5. http://www14.uniovi.es/tutorED/estlineales/interlistafr.htm
• 6. http://oviedo3.ccu.uniovi.es/martin/EDI/ListPage.htm
Bibliografía - Webgrafía