Title: Colas y Listas Enlazadas
1Colas y Listas Enlazadas
Colas Listas Enlazadas Colas doblemenre enlazadas
2Colas
- Una cola se diferencia de una pila en que las
operaciones de inserción y extracción siguen el
principio de primero en entrar - primero en salir
(first-in-first-out, FIFO). - Los elementos se pueden insertar en cualquier
momento, pero solo el elemento que ha permanecido
el mayor tiempo puede ser extraído. - Los elementos se insertan (enqueued) al final
(rear) y se extraen (dequeued) desde el frente
(front).
3El tipo de Dato Abstracto Cola
- La cola tiene dos métodos fundamentales
- enqueue(o) Inserta objecto o al final de la cola
- dequeue() Extrae el objeto del frente de la cola
y lo devuelve ocurre un error si la cola está
vacía - Los siguientes métodos de soporte deben ser
definidos - size() Devuelve el núemro de objetos en la cola
- isEmpty() Devuelve un valor lógico que indica si
la cola está vacía - front() Devuelve, sin eliminar, el objeto del
frente de la cola ocurre un error si la cola
está vacía
4Cola basada en Array
- Crea una cola usando un array de forma circular.
- Se especifica un tamaño máximo N, e.g. N
1,000. - La cola consiste de un array Q de N-elementos y
dos variables enteras - -f, índice del elemento del frente
- -r, índice del elemento siguiente al final de
la cola - configuración normal
- Preguntas
- Qué significa fr?
- Cómo se calcula el número de elementos en la cola
desde f y r?
5Cola basada en Array (1)
Pseudocódigo
Algoritmo size() return (N - f r) mod
N Algoritmo isEmpty() return (f
r) Algoritmo front() if isEmpty() then throw
a QueueEmptyException return Qf
Algoritmo dequeue() if isEmpty() then throw
QueueEmptyException temp ? Qf Qf ? null f
? (f 1) mod N return temp Algoritmo
enqueue(o) if size N - 1 then throw
QueueFullException Qr ? o
6Implementación de una Cola con una Lista Enlazada
Simple
Lista Enlazada Simple Nodos conectados en cadena
por enlaces
La cabeza de la lista es el frente de la cola, la
cola de la lista es el final de la cola. Porqué
no lo contrario?
7Extración de la Cabeza
8Insertando por la cola
9Colas con finales dobles
Una cola con doble-final, o deque, soporta
inserción y extracción desde el frente y el
final. El Tipo de Dato Abstracto
Deque insertFirst(e) Inserta e al de-inicio de
la deque. insertLast(e) Inserta e al de-final de
la deque removeFirst() Extrae y devuelve primer
elemento removeLast() Extrae y devuelve último
elemento Métodos de soporte adicionales first(
) last() size() isEmpty()
10Implementando Pilas y Colas con Deques
Pilas con Deques
Colas con Deques
11El Patrón Adaptor
- El uso de un deque para implementar una pila o
cola es un ejemplo del patrón adaptor. Los
patrones Adaptor patterns implementan una clase
mediante el uso de métodos de otra clase. - En general, las clases adaptor especializan
clases generales - Dos aplicaciones son
- Especializar una clase general mediante la
modificación de algunos métodos. - Ej implementación de una pila con un deque.
- Especializar los tipos de objetos usados por una
clase general. - Ej Definición de la clase IntegerArrayStack que
adapta ArrayStack para almacenar solo enteros.
12Implementación de Deques con Listas Doblemente
Enlazadas
- La eliminación al final de una lista enlazada
simple no se puede realizar en tiempo constante. - Para implementar una deque, se usa una lista
doblemente enlazada, con nodos cabeceros y
finales especiales
- Un nodo de una lista doblemente enlazada tiene un
enlace next y prev. Soporta los siguientes
métodos - setElement(Object e)
- setNext(Object newNext)
- setPrev(Object newPrev)
- getElement()
- getNext()
- getPrev()
- Mediante el uso de una lista doblemente enlazada,
todos los métodos de un corren en tiempo O(1).
13Implementación de Deques con Listas Doblemente
Enlazadas (1)
- Cuando se implementan listas doblemente
enlazadas, se añaden dos nodos especiales en los
finales de las listas los nodos header y
trailer. - El nodo header va antes del primer elemento de la
lista. Tiene un enlace válido next y null como
enlace prev. - El nodo trailer va después del último elemento.
Tiene una referencia prev válida pero una
referencia nula en next.
NOTA los nodos header y trailer son centinelas o
nodos vacios porque no guardan elementos.
14Implementación de Deques con Listas Doblemente
Enlazadas (2)
Visualización del código para removeLast().