Está en la página 1de 12

Estructuras de Datos

Tema 1. Introduccin
Tema 2. Anlisis de Algoritmos
Tema 3. Listas
Tema 4. Pilas y Colas
Tema 5. rboles
Tema 6. TDAs ordenados
Tema 7. Mapas
Tema 8. Conjuntos, Bolsas y Listas sin repeticin
Tema 9. Grafos

Estructuras de Datos

M. Aldea
Oct-13

Tema 4. Pilas y Colas

Tema 4. Pilas y Colas


4.1.
4.2.
4.3.
4.4.
4.5.
4.6.
4.7.
4.8.
4.9.

TDA Pila
Implementacin de Pilas basada en array
Implementacin de Pilas basada en celdas enlazadas
TDA Cola
Implementacin de Colas basada en array circular
Implementacin de Colas basada en celdas enlazadas
Comparacin de las implementaciones
Pilas y Colas en Java Collections Framework
Bibliografa

Estructuras de Datos

M. Aldea
Oct-13

Tema 4. Pilas y Colas

Objetivos
Conocer los TDAs Pila y Cola
Conocer las tcnicas bsicas de implementacin de Pilas y
Colas: basadas en array y basadas en estructuras enlazadas
Conocer las ventajas e inconvenientes de las distintas tcnicas
de implementacin de acuerdo a su complejidad espacial y
temporal
Conocer el soporte proporcionado para Pilas y Colas en las
Java Collections
Saber elegir el TDA Pila o Cola y su implementacin que mejor
satisfaga los requisitos de una aplicacin

Estructuras de Datos

M. Aldea
Oct-13

Tema 4. Pilas y Colas


4.1 TDA Pila

4.1 TDA Pila


Coleccin de elementos potencialmente repetidos donde la
posicin de cada elemento es relevante y las inserciones y
eliminaciones slo se pueden realizar en una posicin
denominada cima
Es decir, los elementos se aaden y extraen en orden LIFO
(last-in-first-out, el ltimo en entrar es el primero en salir)

cima
cima
cima

D
C
B
A

apila(E)

E
D
C
B
A

F
E
D
C
B
A

apila(F)

cima

E
D
C
B
A

desapila()

M. Aldea
Oct-13

Estructuras de Datos

Tema 4. Pilas y Colas


4.1 TDA Pila

Operaciones de las pilas


// aade el elemento en la cima de la pila
apila(e: Elemento)
// elimina y retorna el elemento que ocupaba la
// la cima. La cima pasa al siguiente elemento
desapila(): Elemento
// retorna (pero no elimina) el elemento que
// ocupa la cima. La cima no cambia.
cima(): Elemento
// vaca la pila (pasa a tener tamao 0)
haceVaca()
// retorna el tamao de la pila (num. elementos)
tamao(): Entero
// indica si la pila est vaca
estVaca(): Booleano
M. Aldea
Oct-13

Estructuras de Datos

Tema 4. Pilas y Colas


4.1 TDA Pila

Implementaciones de pilas
E
<<interface>>

Pila
+apila(e: E)
+desapila(): E
+cima(): E
+haceVaca(): void
+tamao(): Entero
+estVaca(): Bool

E
PilaArray

Estructuras de Datos

E
PilaSimpleEnlace

M. Aldea
Oct-13

Tema 4. Pilas y Colas


4.1 TDA Pila

Uso de pilas
Pila de platos para fregar
-platos

PlatosParaFregar

Plato
*

<<PilaArray>>

{ordered, nonunique}

+dejaPlato(p: Plato)
+cogePlato():Plato

Pila de operaciones de edicin para implementar el deshacer de un editor de texto


OperacionesDeEdicin
<<PilaSimpleEnlace>>

+registraOp(Op: OperacinDeEdicin)
+ltimaOp(): OperacinDeEdicin

*
{ordered, nonunique}

-operaciones

OperacinDeEdicin
M. Aldea
Oct-13

Estructuras de Datos

Tema 4. Pilas y Colas


4.2 Implementacin de Pilas basada en array

4.2 Implementacin de Pilas basada en array


Array de elementos y cursor que indica la cima de la pila
cuando la pila est vaca cima=-1
elementos : Elemento[N]
cima : Entero
N-1

...
cima=c

parte libre
c+1
c
c-1

Elemento ms nuevo
Segundo elemento ms nuevo

...

parte ocupada

Segundo elemento ms viejo


Elemento ms viejo

1
0

elementos
Estructuras de Datos

M. Aldea
Oct-13

Tema 4. Pilas y Colas


4.2 Implementacin de Pilas basada en array
Implementacin de Pilas basada en array (cont.)

procedimiento apila(e: Elemento)


si tamao() = N entonces
error // no caben ms elementos
fsi
cima := cima + 1
elementos[cima] := e
fprocedimiento
procedimiento desapila(): Elemento
si estVaca() entonces
error // no hay elementos
fsi
cima := cima - 1
retorna elementos[cima+1]
fprocedimiento

Estructuras de Datos

M. Aldea
Oct-13

Tema 4. Pilas y Colas


4.2 Implementacin de Pilas basada en array
Implementacin de Pilas basada en array (cont.)

procedimiento haceVaca()
cima := -1
fprocedimiento
procedimiento tamao(): Entero
retorna cima + 1
fprocedimiento
procedimiento estVaca(): Booleano
retorna cima = -1
fprocedimiento
procedimiento cima(): Elemento
si estVaca() entonces
error
fsi
retorna elementos[cima]
fprocedimiento
M. Aldea
Oct-13

Estructuras de Datos

10

Tema 4. Pilas y Colas


4.3 Implementacin de Pilas basada en celdas enlazadas

4.3 Implementacin de Pilas basada en celdas


enlazadas
Implementacin directa y eficiente (O(1)) utilizando celdas
simplemente enlazadas
inserciones y extracciones por la cabeza de la lista de celdas
c

cima

apila(d)

cima

desapila() retorna d

cima

a
M. Aldea
Oct-13

Estructuras de Datos

11

Tema 4. Pilas y Colas


4.4 TDA Cola

4.4 TDA Cola


Coleccin de elementos potencialmente repetidos donde la
posicin de cada elemento es relevante, las inserciones slo se
pueden realizar por el final y las eliminaciones por el frente
Es decir, los elementos se aaden y extraen en orden FIFO
(first-in-first-out, el primero en entrar es el primero en salir)
a

frente

final

encola(e)

frente

final

desencola() retorna a

b
frente
Estructuras de Datos

e
final
M. Aldea
Oct-13

12

Tema 4. Pilas y Colas


4.4 TDA Cola

Operaciones de las colas


// aade el elemento al final de la cola
encola(e: Elemento)
// elimina y retorna el elemento que ocupaba el
// frente. El siguiente elemento pasa al frente
desencola(): Elemento
// retorna (pero no elimina) el elemento que
// ocupa el frente. El frente no cambia.
frente(): Elemento
// vaca la cola (pasa a tener tamao 0)
haceVaca()
// retorna el tamao de la cola (num. elementos)
tamao(): Entero
// indica si la cola est vaca
estVaca(): Booleano
M. Aldea
Oct-13

Estructuras de Datos

13

Tema 4. Pilas y Colas


4.4 TDA Cola

Implementaciones de colas
E
<<interface>>

Cola
+encola(e: E)
+desencola(): E
+frente(): E
+haceVaca(): void
+tamao(): Entero
+estVaca(): Bool

ColaArray

ColaSimpleEnlace

M. Aldea
Oct-13

Estructuras de Datos

14

Tema 4. Pilas y Colas


4.4 TDA Cola

Uso de colas
Cola de la caja de un supermercado
-clientes
ClientesCaja

Cliente
*

<<ColaArray>>

{ordered}

Cola de trabajos pendientes en una impresora


-trabajos
TrabajosPendientes

TrabajoImpresin
*

<<ColaSimpleEnlace>>

{ordered, nonunique}

Estructuras de Datos

M. Aldea
Oct-13

15

Tema 4. Pilas y Colas


4.5 Implementacin de Colas basada en array circular

4.5 Implementacin de Colas basada en array


circular
Array de elementos y dos cursores que indican el frente y el final
array circular: cuando un cursor sobrepasa la ltima posicin
del array, vuelve a la primera
elementos : Elemento[N]
frente, final : Entero
Ejemplo. Dos configuraciones de cola vlidas:
0

10

frente=6

11

12

13

14

15

final=10

10

final=3

11

12

13

14

15

frente=14
M. Aldea
Oct-13

Estructuras de Datos

16

Tema 4. Pilas y Colas


4.5 Implementacin de Colas basada en array circular
Implementacin de Colas basada en array circular (cont.)

encola(c)

frente

final

6
a

final

desencola()a

frente

6
desencola()b

final
0
frente

c
desencola()c

final
frente

frente
final
M. Aldea
Oct-13

Estructuras de Datos

17

Tema 4. Pilas y Colas


4.5 Implementacin de Colas basada en array circular

Deteccin de cola vaca/llena


Hay dos opciones:
Llevando un contador con el nmero de elementos
-Necesidad de una variable extra (el contador)
+Se puede llenar el array totalmente
Utilizando la posicin relativa de los cursores
+No hace falta ninguna variable extra
-Siempre debe quedar, al menos, una posicin libre en el array
Son soluciones equivalentes
no hay un acuerdo general sobre cual es mejor
unas implementaciones/libros eligen una y otros otra

Estructuras de Datos

M. Aldea
Oct-13

18

Tema 4. Pilas y Colas


4.5 Implementacin de Colas basada en array circular

Deteccin de cola vaca/llena con los cursores


Vaca cuando frente est en la posicin siguiente a final
0
1
2
3
4
5
(final + 1) mod N = frente

frente
final

Problema: en una cola totalmente llena tambin se cumple que


frente est en la posicin siguiente a final
Solucin: no se permite llenar la cola del todo
0

final

frente

frente

final

Llena cuando frente est dos posiciones por delante de final


(final + 2) mod N = frente
Tamao de la cola: (N - frente + final + 1) mod N
M. Aldea
Oct-13

Estructuras de Datos

19

Tema 4. Pilas y Colas


4.5 Implementacin de Colas basada en array circular

Implementacin con contador de elementos


procedimiento haceVaca()
tamao := 0
frente := 0
final := N - 1
fprocedimiento

frente
tamao=0

final

procedimiento tamao(): Entero


retorna tamao
fprocedimiento
procedimiento estVaca(): Booleano
retorna tamao = 0
fprocedimiento

Estructuras de Datos

M. Aldea
Oct-13

20

Tema 4. Pilas y Colas


4.5 Implementacin de Colas basada en array circular
Implementacin con contador de elementos (cont.)

procedimiento frente(): Elemento


si estVaca() entonces
error
fsi
retorna elementos[frente]
fprocedimiento
procedimiento desencola(): Elemento
si estVaca() entonces
error
fsi
tamao := tamao - 1
Elemento temp := elementos[frente]
frente := (frente + 1) mod N
retorna temp
fprocedimiento
Estructuras de Datos

M. Aldea
Oct-13

21

Tema 4. Pilas y Colas


4.5 Implementacin de Colas basada en array circular
Implementacin con contador de elementos (cont.)

procedimiento encola(e: Elemento)


si tamao() = N entonces
error
fsi
tamao := tamao + 1
final := (final + 1) mod N
elementos[final] := e
fprocedimiento

mod: operador mdulo (en Java es el operador %)


resto de la divisin entera
7 mod 4 = 3
18 mod 9 = 0
0 mod 4 = 0
M. Aldea
Oct-13

Estructuras de Datos

22

Tema 4. Pilas y Colas


4.6 Implementacin de Colas basada en celdas enlazadas

4.6 Implementacin de Colas basada en celdas


enlazadas
Implementacin directa y eficiente utilizando celdas simplemente
enlazadas
inserciones por el final y extracciones por el principio de la lista
final

frente

encola(d)

frente

final

desencola() a
final
frente

d
M. Aldea
Oct-13

Estructuras de Datos

23

Tema 4. Pilas y Colas


4.6 Implementacin de Colas basada en celdas enlazadas
Implementacin de Colas basada en celdas enlazadas (cont.)

Implementacin con celda de cabecera


tipo Celda
contenido : puntero a Elemento
siguiente : puntero a Celda
ftipo
frente : puntero a Celda
final : puntero a Celda
numEle : Entero
procedimiento Constructor
numEle := 0
frente := nueva Celda
frente.siguiente := null
final := frente
fprocedimiento

Estructuras de Datos

final

null
frente

M. Aldea
Oct-13

24

Tema 4. Pilas y Colas


4.6 Implementacin de Colas basada en celdas enlazadas
Implementacin de Colas basada en celdas enlazadas (cont.)

procedimiento encola(e : Elemento)


nuevaCelda : puntero a Celda := nueva Celda
nuevaCelda.contenido := e

final

numEle++
final.siguiente := nuevaCelda
final := nuevaCelda
fprocedimiento

frente
encola(z)
final
a

frente

procedimiento desencola(): Elemento


si estVaca() entonces
error
fsi
frente
numEle-frente := frente.siguiente
retorna frente.contenido
fprocedimiento

final

desencola()
final
a

frente

M. Aldea
Oct-13

Estructuras de Datos

25

Tema 4. Pilas y Colas


4.6 Implementacin de Colas basada en celdas enlazadas
Implementacin de Colas basada en celdas enlazadas (cont.)

procedimiento frente(): Elemento


si estVaca() entonces
error
fsi
retorna frente.siguiente.contenido
fprocedimiento
procedimiento estVaca(): Boolean
retorna numEle = 0
fprocedimiento

final
a

procedimiento haceVaca()
numEle := 0
frente := final
fprocedimiento

frente
haceVaca()
final
a

frente
M. Aldea
Oct-13

Estructuras de Datos

26

Tema 4. Pilas y Colas


4.7 Comparacin de las implementaciones

4.7 Comparacin de las implementaciones


Eficiencia temporal de las operaciones:
Operacin
pila/cola

Array y Lista enlazada

apila/encola

O(1)

desapila/desencola

O(1)

cima/frente

O(1)

tamao

O(1)

haceVaca

O(1)

estVaca

O(1)

Es algo ms rpida la implementacin basada en array

Estructuras de Datos

M. Aldea
Oct-13

27

Tema 4. Pilas y Colas


4.7 Comparacin de las implementaciones
Comparacin de las implementaciones (cont.)

Caractersticas generales:
Caracterstica

Array

Lista Enlazada

Requisitos de memoria

O(N), donde N es el tamao del


array de elementos

O(n), donde n es el nmero


de elementos en la pila

Fcil crecimiento

No, requiere
redimensionado y copia

S, puesto que
no est acotada

Aprovechamiento de la
memoria

Desperdicia
memoria

Usa la memoria
justa

En general la implementacin con array es ms sencilla y eficiente


debera usarse siempre que se tenga bien acotada la longitud
mxima que puede alcanzar la pila/cola

M. Aldea
Oct-13

Estructuras de Datos

28

Tema 4. Pilas y Colas


4.8 Pilas y Colas en Java Collections Framework

4.8 Pilas y Colas en Java Collections


Framework
E
<<interface>>

Iterable

E
<<interface>>

Collection
Cola
JCF NO incluye la
interfaz Stack (Pila)

E
<<interface>>

Queue

Pila
E
LinkedList

M. Aldea
Oct-13

Estructuras de Datos

29

Tema 4. Pilas y Colas


4.8 Pilas y Colas en Java Collections Framework

Pilas en JCF
JFC no incluye ninguna interfaz especfica para las pilas
Utilizaremos LinkedList
-platos

PlatosParaFregar

Plato
*

<<LinkedList>>

+dejaPlato(p: Plato)
+cogePlato():Plato

{ordered, nonunique}

public class PlatosParaFregar {


private LinkedList<Plato> platos =
new LinkedList<Plato>();
...

Estructuras de Datos

M. Aldea
Oct-13

30

Tema 4. Pilas y Colas


4.8 Pilas y Colas en Java Collections Framework
Pilas en JCF (cont.)

De la clase LinkedList usaremos los mtodos:


void addFirst(E e); // apila
E removeFirst(); // desapila
// si cola vaca: lanza excepcin
E getFirst(); // cima
// si cola vaca: lanza excepcin
void clear();

// haceVaca

int size();

// tamao

boolean isEmpty(); // estVaca

M. Aldea
Oct-13

Estructuras de Datos

31

Tema 4. Pilas y Colas


4.8 Pilas y Colas en Java Collections Framework

Colas en JCF
Interfaz Queue, utilizando su implementacin LinkedList
-trabajos
TrabajosPendientes

TrabajoImpresin
*

<<LinkedList>>

{ordered, nonunique}

public class TrabajosPendientes {


private Queue<TrabajoImpresin> trabajos =
new LinkedList<TabajoImpresin>();
...

Estructuras de Datos

M. Aldea
Oct-13

32

Tema 4. Pilas y Colas


4.8 Pilas y Colas en Java Collections Framework
Colas en JCF (cont.)

public interface Queue<E> extends Collection<E> {


// encola
boolean offer(E e);// si cola llena: retorna false
boolean add(E e);// si cola llena: lanza excepcin
// frente
E peek();
// si cola vaca: retorna null
E element(); // si cola vaca: lanza excepcin
// desencola
E poll();
// si cola vaca: retorna null
E remove(); // si cola vaca: lanza excepcin
}
Adems, de Collection hereda los mtodos:
void clear();
// haceVaca
int size();
// tamao
boolean isEmpty(); // estVaca
Estructuras de Datos

M. Aldea
Oct-13

33

Tema 4. Pilas y Colas


4.9 Bibliografa

4.9 Bibliografa
[1] Michael T. Goodrich, Roberto Tamassia, Data structures and
algorithms in Java. John Wiley & Sons, 2006.
[2] Aho A.V., Hopcroft J.E., Ullman J.D., Estructuras de datos y
algoritmos. Addison-Wesley, 1988.
[3] Weiss, Mark Allen, Data Structures and Algorithm Analysis in
Java. Pearson Education, 2007.
[4] Weiss, Mark Allen, Estructuras de datos y algoritmos.
Addison-Wesley Iberoamericana, 1995.
[5] Sahni, Sartaj, Data structures, algorithms, and applications in
Java. McGraw Hill, 2000
[6] The Java Tutorials: Collections
http://docs.oracle.com/javase/tutorial/collections/index.html

Estructuras de Datos

M. Aldea
Oct-13

34

También podría gustarte