Beruflich Dokumente
Kultur Dokumente
Pilas Colas
Prof.: Mauricio Solar
Primer Semestre,
2010
Indice
TDA: Pilas
TDA: Colas
Colas de Prioridad
Anillos
BiColas
BiColas Circulares
Pilas - Stack
Una de las estructuras de datos ms primitivas y ms antiguas en
la ciencia de los computadores.
A pesar de ser tan simple, es esencial en los compiladores,
SS.OO., etc.
Se pueden representar como una lista lineal que crece y decrece
por el mismo extremo.
El ltimo elemento que se incorpora a la estructura, es el
nico que se puede consultar y eliminar.
LIFO
Entrada
Salida
trabajos
Pilas - Stack
Es un tipo lineal de datos, secuencia de elementos de un tipo,
una estructura tipo LIFO (Last In First Out) ltimo en entrar
primero en salir.
Son un subconjunto de las listas, en donde las eliminaciones e
inserciones se realizan en un solo extremo.
LIFO
Entrada
Salida
trabajos
4
2
3
1
8
3
1
Iteracin 1
5
1
Iteracin 2
9
Iteracin 3
apilar
Invocacin:
Invocacin:CrearPilaVaca(P)
CrearPilaVaca(P)
PilaVaca:
PilaVaca:Pila
PilaLgico
Lgico
PilaVaca(P)
PilaVaca(P)==ListaVaca(P)
ListaVaca(P)
Invocacin:
Invocacin:PilaVaca(P)
PilaVaca(P)
Apilar:
Apilar:Elemento
ElementoxxPila
PilaPila
Pila
Apilar(
Apilar(x,x,PP))==Insertar(
Insertar(x,x,Primera(P),
Primera(P),PP))
Invocacin:
Invocacin:Apilar(x,P)
Apilar(x,P)
desapilar
tope
Invocacin:
Invocacin:Despilar(P)
Despilar(P)
Invocacin:
Invocacin:Tope(P)
Tope(P)
PILAS
La representacin grfica de una pila es como la de cualquier
estructura dinmica:
tope
...
NULL
PILAS Implementaciones
typedef struct nodoP {
tElemento info;
struct nodoP* sig;
}
Las pilas se implementan como una lista enlazada simple.
El puntero de la lista (el tope) apunta al primer nodo de la
pila.
tope
a1
a2
pila
an
PILAS Implementaciones
boolean
booleanEstaVacia
EstaVacia(struct
(structnodoP*
nodoP*tope)
tope) {{
return
return(tope
(tope
sig
sig====NULL);
NULL);
////Verdadero
Verdaderosisiest
estvaca
vaca
}}
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
////almacena
info
info==x;
x;
almacenaelelelemento
elemento
qq
////enlaza
sig
sig==tope;
tope;
enlazaalalnodo
nodocon
conelelresto
resto
tope
////yylo
tope==q;
q;
lopone
poneen
enlalacabeza
cabeza
}}
PILAS Implementaciones
tElemento
tElementoPop
Pop(struct
(structnodoP*
nodoP*tope)
tope) {{
struct
structnodoP*
nodoP*temp;
temp;
tElemento
tElementox;
x;
ifif(EstaVaca(tope))
(EstaVaca(tope))
printf
printf(Error:
(Error:pila
pilavaca);
vaca);
else
else {{
xx==tope
tope
info;
info;
temp
temp==tope;
tope; ////Se
Seeliminar
eliminareleltope
tope
tope
tope==tope
tope
sig;
sig;
free(temp);
free(temp);
return(x);
return(x);
}}
}}
Ejemplo
1000
100
100
100
100
10
10
10
10
10
push(10)
push(100)
push(1)
pop()
push(1000)
100
10
pop()
2a
Notacin postfija
La idea bsica detrs de la notacin de cadenas polacas es que
los operadores se escriben al final y no en medio de las
expresiones.
A + B se escribe como A B +.
En esta forma, el operador + se considera como una
instruccin para sumar los valores de las dos variables que
lo preceden inmediatamente. Ejemplo:
Notacin postfija
Reglas bsicas para convertir expresiones infijas a posfijas:
1. Si el elemento es un ( se coloca directamente en la pila de
operadores.
2. Si el elemento es un ), los operadores de la pila se transfieren
uno a uno, al extremo derecho de la expresin posfija hasta
llegar a un (. Este se saca pero no va a la salida.
3. Si el elemento localizado es una variable, se coloca
inmediatamente en el extremo derecho de la expresin posfija
que se est creando.
4. Si el elemento es un operador y es de menor precedencia que
el operador en la pila, el operador de la pila se saca y va a la
salida, continuando de esta manera hasta encontrar un ( o
hasta que el operador de la pila sea de menor precedencia.
Cuando esto ocurre, el operador en turno se apila.
b b 2 4 a c
2a
En notacin infija:
( -b + ( b ^ 2 4 * a * c ) ^ ( 1 / 2 ) ) / ( 2 * a )
En notacin postfija:
-b b 2 ^ 4 a c * * 1 2 / ^ + 2 a * /
Algoritmo
1.
2.
Implementar la pila
Repetir hasta encontrar el fin de la expresin postfija
Tomar un carcter.
Si el carcter es un operando colocarlo en la pila.
Si el carcter 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) {{
//// Funcin
Funcinque
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);
}}
Implementacin 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
Algoritmo para encontrar el factorial de un nmero mediante
pilas
leer n;
mientras n > 1 {
push(n);
n = n-1;
}
factorial = 1;
mientras pila no est vaca
factorial = factorial * pop();
Ejercicios
1. Evaluar, indicando en cada paso el estado de la pila:
Pila p = (Pila *)malloc(sizeof(Pila));
a) Pop ( Pop ( Push ( 3, Pop ( Push ( 4, Push ( 5, Push ( 6, p ) ) ) ) ) ) )
b) EstaVacia(Pop(Pop(Push( 8,p))))
c) InvPila( Push ( 3, Pop ( Push ( 4, Push ( 5, Push ( 6, p ) ) ) ) ) ) ) )
2. Escribir una funcin que permita contar todos los elementos pares que
estn en una pila dada.
COLAS
COLAS
Colas - queue
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.
FIFO
entrada
trabajos
salida
Colas
Las colas son un subconjunto de las listas, en donde las
eliminaciones se dan al comienzo de la lista y las inserciones
al final.
Los elementos se procesan en el orden como se reciben
(similar a la cola de impresin en redes).
Cuando se desea accesar un elemento que no est en un
extremo, obligadamente se debe realizar una operacin
desplazamiento de los nodos anteriores (o posteriores) a l.
FIFO
entrada
trabajos
salida
encolar
final
frente
desencolar
CrearColaVaca( C )
ColaVaca( C ) B
PonerEnCola( x, C )
SacarDeCola( C )
Frente( C ) E
Invocacin:
Invocacin:CrearColaVaca(C)
CrearColaVaca(C)
ColaVaca:
ColaVaca:Cola
ColaLgico
Lgico
ColaVaca(C)
ColaVaca(C)==ListaVaca(C)
ListaVaca(C)
Invocacin:
Invocacin:ColaVaca(C)
ColaVaca(C)
PonerEnCola:
PonerEnCola:Elemento
ElementoxxCola
ColaCola
Cola
PonerEnCola(
PonerEnCola(x,x,CC))==Insertar(
Insertar(x,x,Fin(C),
Fin(C),CC))
Invocacin:
Invocacin:PonerEnCola(x,
PonerEnCola(x,C)
C)
Invocacin:
Invocacin:SacarDeCola
SacarDeCola(C)
(C)
Frente:
Frente:Cola
ColaElemento
Elemento
Frente(
Frente(CC)){{
Si
Si(no
(noListaVaca(C))
ListaVaca(C))
retornar(
retornar(Recuperar(Primera(C),
Recuperar(Primera(C),C)
C)))
Sino
Sino Error
Error
}}
Invocacin:
Invocacin:Frente(C)
Frente(C)
Colas - Implementacin
Estructura para los nodos:
info
sig
Salida de Dato
Colas
Representacin grfica:
frente
final
...
NULL
Colas
Otra representacin:
Colas
frente
final
NULL
Colas
INSERTAR(dato;frente;final)
INSERTAR(dato;frente;final){{
Nuevo(p);
Nuevo(p);
p->info
p->info==dato;
dato;
p
dato
ififfinal
final====NULL
NULL{{
frente
////1a
frente==p;p;
1a
final
final==p;p; ////2a
2a
}}
else
else{{
final->sig
final->sig==p;p; ////1b
1b
final
final==p;p; ////2b
2b
}}
final
2a
dato
frente
1a
final
p->sig
p->sig==null;
null; //// 33
2b
p
final
frente
...
}}
3
null
dato
1b
3
null
Colas
Algoritmo
AlgoritmoEliminar(frente)
Eliminar(frente)
{{
ififfrente
frente====NULL
NULL
cola
colavaca
vaca
else
else {{
pp==frente;
//// 11
frente;
frente
frente==frente->sig;
frente->sig; //// 22
free(p);
//// 33
free(p);
}}
frente
null
frente
frente
final
2
...
null
}}
Colas - Implementacin
boolean
booleanEstaVaca
EstaVaca(tCola
(tCola**frente,
**frente,tCola
tCola**final)
**final){{
//// Verificacin
de
cola
vaca
Verificacin de cola vaca
ifif((*final
((*final==
==NULL)
NULL)&&
&&((*frente
*frente==
==NULL))
NULL))
return(
////Verdadero
return(true);
true);
Verdaderosisiest
estvaca
vaca
else
else
return
return(false);
(false);
}}
Colas - Implementacin
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; ////los
losparntesis
parntesisson
sonrequeridos
requeridospor
por
(*frente)->sig
(*frente)->sig==NULL;
NULL; ////precedencia
precedenciade
deoperandos
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;
}}
}}
Colas - Implementacin
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
No es necesario mover
todos los elementos
Apuntadores al frente
y al final
Colas - Ejercicios
Escribir
Escribir una
una funcin
funcin que,
que, dada
dada una
una cola
cola que
que almacena
almacena nmeros
nmeros
enteros,
enteros,cuente
cuentelalacantidad
cantidadde
demltiplos
mltiplosde
de55que
quecontiene.
contiene.
Solucin:
Solucin:
int
intMul5EnCola(tCola**frente,
Mul5EnCola(tCola**frente,tCola**final)
tCola**final){{
////Contar
Contarlos
losnmeros
nmerosmltiplos
mltiplosde
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);
}}
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
losmltiplos
mltiplosde
de55
m5=
m5=Multiplos5EnCola(&frente,
Multiplos5EnCola(&frente,&final);
&final);
printf("\n\nNumeros
printf("\n\nNumerosmultiplos
multiplosde
de5:
5:%d",m5);
%d",m5);
getch();
getch();
}}
Operaciones:
Estado de la cola:
Inicio: Cola Vaca
1.1.- Insertar A
2.2.- Insertar B
3.3.- Insertar C
Tipos de colas
Colas de prioridad
Anillos
BiColas
BiColas circulares
...
dato2 pr2
daton prn
typedef struct {
// Informacion
// Prioridad
Cola *sgte;
} Cola_Prioridad;
Final
prim
P1
I11
P2
I21
I12
I13
P3
ult
P4
I41
I42
Implementacin en C Anillos
Declaracin:
struct tcola {
int clave;
struct tcola *sig;
};
Creacin:
void crear(struct tcola **cola) {
*cola = NULL;
}
Funcin que devuelve verdadero si la cola est vaca:
int vacia(struct tcola *cola) {
return (cola == NULL);
}
Implementacin 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;
}
Implementacin 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);
}
}
Implementacin 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
BiColas circulares
Permite la implementacin 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
Las rotaciones tanto a derecha como a izquierda no suponen
tampoco complicacin alguna, ya que se tienen punteros en
ambas direcciones.
Bibliografa - Webgrafa
Abstraccin 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
Bibliografa - Webgrafa
Listas, pilas y colas. Ejercicios
7. Fundamentos de programacin. Libro de problemas. Luis
Joyanes Aguilar
8. http://old.algoritmia.net/listas.htm
9. Estructura de datos y organizacin de archivos. Mary E.
Loomis. Prentice Hall. 2a Ed.
10. Pilas y Colas. Cursos Propeduticos 2006, Programacin y
Estructuras de Datos. Manuel Montes, Claudia Feregrino.