Colas y Listas

Download Report

Transcript Colas y Listas

Colas y Listas Enlazadas
Colas
Listas Enlazadas
Colas doblemenre enlazadas
1
Colas
•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).
2
El 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
3
Cola 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 f=r?
Cómo se calcula el
número de elementos en
la cola desde f y r?
4
Cola 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 Q[f]
Algoritmo dequeue():
if isEmpty() then
throw
QueueEmptyException
temp  Q[f]
Q[f]  null
f  (f + 1) mod N
return temp
Algoritmo enqueue(o):
if size = N - 1 then
throw
QueueFullException
Q[r]  o
5
Implementació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?
6
Extración de la Cabeza
7
Insertando por la cola
8
Colas 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()
9
Implementando Pilas y Colas con
Deques
Pilas con Deques:
Colas con Deques:
10
El 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.
11
Implementació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
12
corren en tiempo O(1).
Implementació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.
13
Implementación de Deques con
Listas Doblemente Enlazadas (2)
Visualización del
código para
removeLast().
14