Post on 14-Oct-2015
7/13/2019 Cap Tulo 4 - TDA Pila y TDA Cola
1/12
Estructuras de Datos Marcela Muoz - Claudio Henrquez
1
CAPITULO 4: Pilas y Colas
4.1TDA Pila o Stack
La pila es una clase particular de lista en donde todas las inserciones, eliminaciones y
recuperaciones ocurren en un extremo de la lista (tope). Otros nombres son listas tipo
LIFO (last in first out), que significa ltimo e entrar primero en salir.
4.1.1 Definicin del TDA Stack
Dominio
D={Stack, dato, boolean}, con los siguientes objetos:
S: Lista tipo Stack.
x: Objeto tipo dato.
V,F: Valores lgicos.
Funciones
Se definen las siguientes funciones:
1. anular(S)=>S: Vaca el stack S.2. tope(S)=>x: Devuelve el elemento que est en el tope del stack.3. pop(S)=>S: Elimina el elemento que est en el tope del stack.4. push(x,S)=>S: Inserta el elemento en el tope del stack.5. esVacia(S)=>{V,F}: Devuelve verdadero si la pila est vaca y falso si no lo
est.
7/13/2019 Cap Tulo 4 - TDA Pila y TDA Cola
2/12
Estructuras de Datos Marcela Muoz - Claudio Henrquez
2
4.1.2 Implementacin de Pilas
a) Implementacin por arreglos
Se define la estructura:
struct pila{
int tope;
tipo_elem elem[LONG_MAX];
};
El tope corresponde a la posicin del primer elemento del stack.
9
8
7
6
5
4
3 x
2 C
1 B
0 A
Creacin de la pila
struct pila *crear(){
struct pila *pt;
pt=(struct pila *) malloc(sizeof(srtucr pila));
pt tope=-1;
return(pt);
}
Tope=3
PUSH POP
7/13/2019 Cap Tulo 4 - TDA Pila y TDA Cola
3/12
Estructuras de Datos Marcela Muoz - Claudio Henrquez
3
Ejemplo 1:Verificacin pila vaca
boolean esVacia(struct pila *pt){
if (pt tope==-1)
return true;
else
return false;
}
Ejemplo 2:Funcin almacenar en el tope: PUSH
struct pila *push(tipo_elem x, struct pila *stack){
if(stack tope >= LONG_MAX-1)
printf(Stack Lleno);
else {
stack tope++;
stackelem[stack tope]=x;
}
return (stack);
}
Ejemplo 3:Funcin eliminar del tope: POP
tipo_elem pop(struct pila *stack){
if(esVacia(stack)){
printf(Stack Vacio);
return NULL;
}
else{
x=stackelem[stacktope];
stack tope--;
return(x);
}
}
7/13/2019 Cap Tulo 4 - TDA Pila y TDA Cola
4/12
Estructuras de Datos Marcela Muoz - Claudio Henrquez
4
b) Implementacin por listas enlazadas
Se utiliza la siguiente estructura:
struct pila{
tipo_elem elem;
struct pila *sgte;
};
Las pilas se implementan como una lista enlazada simple con cabeza, la cual, apunta al
tope del stack.
Creacin de la pila
struct pila *crear(){
struct pila *pt;
pt=(struct pila *)malloc(sizeof(struct pila));
ptsgte=NULL;
return pt;
}
Ejemplo 1: Verificar pila vaca
boolean esVacia(struct pila *stack){
if (stacksgte ==NULL)
return true;
else
return false;
}
a3 a2 a1Cabeza TOPE
7/13/2019 Cap Tulo 4 - TDA Pila y TDA Cola
5/12
Estructuras de Datos Marcela Muoz - Claudio Henrquez
5
Ejemplo 2: Funcin PUSH
struct pila *push(tipo_elem x, struct pila *stack){
struct pila *nodo;
nodo =crear();
nodoelem=x;
nodosgte=stacksgte;
stacksgte=nodo;
return stack;
}
Ejemplo 3:Funcin POP
struct pila *pop(struct pila *stack){
struct pila *temp;
if (esVacia(stack)){
printf(Stack Vacio);
return NULL;
}
else{
temp=stacksgte;
stacksgte=tempsgte;
free(temp);
return(stack);
}
}
4.1.3 Aplicaciones de las pilas
Las pilas, a pesar de la simplicidad de su estructura, tienen mltiples aplicaciones. Se
usa entre otras cosas para:
Realizar llamadas a subrutinas Manejar funciones recursivas Evaluacin de operaciones aritmticas Recorrido de rboles y grafos
En general, las aplicaciones de las pilas tienen como concepto comn la idea de
almacenar una situacin, o dejar algo pendiente, mientras se resuelve otra parte delproblema.
7/13/2019 Cap Tulo 4 - TDA Pila y TDA Cola
6/12
Estructuras de Datos Marcela Muoz - Claudio Henrquez
6
Ejemplo1:Cada vez que se llama a un subprograma (subrutina o funcin) es necesario
guardar el estado del programa que realiza la llamada:
Direccin del programa a la que debe volver cuando termine. Las variables del programa, junto con sus valores antes de la llamada.
El entorno del programa se guarda en una pila. Esta operacin ser especialmente
importante cuando se realicen llamadas recursivas. En estos casos, si no se realiza un
control del tamao de la pila puede producirse un desbordamiento.
Funcin Factorial Recursiva
.
.
.
.
.
(n-1)*fact(n-2)
return;
n*fact(n-1)
return;
f=fact(n)
Segunda Instancia
Primera Instancia
Llamada Principal
7/13/2019 Cap Tulo 4 - TDA Pila y TDA Cola
7/12
Estructuras de Datos Marcela Muoz - Claudio Henrquez
7
Ejemplo 2: Evaluacin de expresiones aritmticas en notacin post fija. Evaluar la
expresin (4*5)+(6*7) = 45*67*+
Para realizar esto se lee la entrada elemento a elemento , si es un operando se mete en
la pila (PUSH(x,S)) y si es un operador, se sacan los operandos se realiza la operacin y
se guarda el resultado en la pila.
7/13/2019 Cap Tulo 4 - TDA Pila y TDA Cola
8/12
Estructuras de Datos Marcela Muoz - Claudio Henrquez
8
4.2TDA Colas o Queues
Las colas son casos particulares de lista en donde los elementos son insertados en un
extremo (atrs) y se eliminan en el otro extremo (adelante). Esto corresponde a las listas
FIFO (first in first out) que significaprimero en entrar primero en salir.
4.2.1 Definicin del TDA Cola o Queue
Dominio
D={cola, dato, boolean}, con los siguientes objetos:
Q: Lista de tipo cola.
x: objeto tipo dato.
V,F: valores lgicos.
Funciones
1. anular(Q)=>Q: Vaca la cola.2. frente(Q)=>x: Devuelve el elemento que est en el frente de la cola.3. enqueue(x,Q)=>Q: Inserta el elemento al final de la cola.4. dequeue(Q)=>Q: Elimina el elemento del principio o frente de la cola.5. esVacia(Q)=>{V,F}: Devuelve verdadero si la cola est vaca y falso si no lo
est.
4.2.2 Implementacin del TDA Cola
a) Implementacin por arreglosEn esta implementacin se puede usar 2 cursores apuntando hacia adelante y atrs.
Adelantese hace por convencin siempre uno menos que el frente real, de modo que si
adelantees igual a atrsla cola est vaca.
Declaraciones
struct cola{
tipo_elem elem[LONG_MAX];
int adelante, atras;};
7/13/2019 Cap Tulo 4 - TDA Pila y TDA Cola
9/12
Estructuras de Datos Marcela Muoz - Claudio Henrquez
9
Creacin de la cola
struct cola *crear(){
struct cola *q;
q=(struct cola *)malloc(sizeof(struct cola));
qadelante=-1;
qatras=-1;
return q;
}
Ejemplo 1:Verificacin cola vaca
boolean esVacia(struct cola *q){
if(qadelante==qatras)
return true;
else
return false;
}
Ejemplo 2:Funcin almacenar al final Enqueue
struct cola *enqueue(tipo_elem x, struct cola *q){
if(qatras==LONG_MAX-1)
printf(Cola Llena);
else{
qatras++;
qelem[qatras]=x;
}
return q;
}
Adelante =-1 a b c d e x
Atrs=5 0 1 2 3 4 5 6 7 8 9
7/13/2019 Cap Tulo 4 - TDA Pila y TDA Cola
10/12
Estructuras de Datos Marcela Muoz - Claudio Henrquez
10
Ejemplo 3:Funcin eliminar desde el frente de la cola Dequeue.
struct cola *dequeue(struct cola *q){
if(esVacia(q))
printf(Cola vaca);
else
qadelante++;
return q;
}
b) Implementacin por listas enlazadasAl igual que en las pilas, cualquier implementacin de lista es utilizable para realizar
una cola. Sin embargo, conviene aprovechar el hecho que insercin y eliminacin
ocurre siempre en el mismo lugar (extremos de la cola). Para evitar tener que recorrer la
lista cada vez que se requiere insertar algo al final es recomendable mantener un puntero
al ltimo elemento igual que al primero como lo hace cualquier lista.
Se utiliza la siguiente estructura para los nodos.
struct lista{
tipo_elem elem;
struct lista *sgte;
};
Para manejar la cola se usa una estructura con dos punteros
struct cola {
struct lista *adelante, atrs;
};
a1 a2 a3
Cabeza
Primero ltimo
7/13/2019 Cap Tulo 4 - TDA Pila y TDA Cola
11/12
Estructuras de Datos Marcela Muoz - Claudio Henrquez
11
Habitualmente se utiliza la implementacin de listas simplemente enlazadas con cabeza.
De este modo se facilita la operacin de agregar un elemento, al no tener que
preocuparse del caso especial, cuando la cola este vaca.
Creacin de la cola
struct cola *crear(){
struct cola *Q;
struct lista *nodo;
Q=(struct cola *)malloc(sizeof(struct cola));nodo=(struct lista*) malloc(sizeof(struct lista));
Qadelante=nodo;
Qatras=nodo;
nodosgte=NULL;
return (Q);
}
Ejemplo 1: Verificacin Cola vaca
boolean esVacia(struct cola *Q){
if( Qadelante ==Qatras)
return true;
else
return false;
}
Ejemplo 2:Agregar al final de la lista Enqueue
struct cola *enqueue(tipo_elem x, struct cola *Q){
struct lista *nodo=(struct lista *)malloc(sizeof(struct lista))
nodosgte=NULL;
nodoelem=x;
Qatrassgte=nodo;
Qatras=nodo;
return (Q);
}
Cabeza 0AdelanteAtrs
Q
7/13/2019 Cap Tulo 4 - TDA Pila y TDA Cola
12/12
Estructuras de Datos Marcela Muoz - Claudio Henrquez
12
Ejemplo 3:Funcin eliminar desde el frente de la cola Dequeue.
struct cola *dequeue(struct cola *Q){
struct cola *temp;
if(esVacia(Q))
printf(Cola Vacia);
else{
temp=Qadelantesgte;
Qadelantesgte=Qadelantesgtesgte;
free(temp);
}
return (Q);
}
4.3.3 Aplicaciones TDA Cola
Algunas aplicaciones de las colas son:
1.
Para modelar 'colas reales' en el mundo de las computadoras: Colas deimpresin, Colas de tareas, Colas de procesos.
2. Simulaciones.3. Bsqueda en achura.
CabezaAdelanteAtrs
Q
a x
CabezaAdelanteAtrs
Q
a x
temp