Vous êtes sur la page 1sur 12

Estructuras de Datos Marcela Muoz - Claudio Henrquez

1
CAPITULO 4: Pilas y Colas

4.1 TDA 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.

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
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(stacktope >= LONG_MAX-1)
printf(Stack Lleno);
else {
stacktope++;
stackelem[stacktope]=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];
stacktope--;
return(x);
}
}
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));
pt sgte=NULL;
return pt;
}

Ejemplo 1: Verificar pila vaca
boolean esVacia(struct pila *stack){
if (stacksgte ==NULL)
return true;
else
return false;
}

a
3
a
2
a
1
Cabeza TOPE
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=temp sgte;
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 del
problema.
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
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.



Estructuras de Datos Marcela Muoz - Claudio Henrquez

8
4.2 TDA 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 significa primero 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 arreglos
En esta implementacin se puede usar 2 cursores apuntando hacia adelante y atrs.
Adelante se hace por convencin siempre uno menos que el frente real, de modo que si
adelante es igual a atrs la cola est vaca.

Declaraciones
struct cola{
tipo_elem elem[LONG_MAX];
int adelante, atras;
};
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(q adelante==qatras)
return true;
else
return false;
}

Ejemplo 2: Funcin almacenar al final Enqueue
struct cola *enqueue(tipo_elem x, struct cola *q){
if(q atras==LONG_MAX-1)
printf(Cola Llena);
else{
qatras++;
qelem[q atras]=x;
}
return q;
}
Adelante =-1 a b c d e x
Atrs=5 0 1 2 3 4 5 6 7 8 9




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 enlazadas
Al 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;
};


a
1
a
2
a
3
Cabeza
Primero ltimo
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 0
Adelante
Atrs
Q
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=Qadelante sgte;
Qadelante sgte=Qadelante sgtesgte;
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 de
impresin, Colas de tareas, Colas de procesos.
2. Simulaciones.
3. Bsqueda en achura.
Cabeza
Adelante
Atrs
Q
a x
Cabeza
Adelante
Atrs
Q
a x
temp

Vous aimerez peut-être aussi