190 likes | 715 Views
Colas y Listas Enlazadas. Colas Listas Enlazadas Colas doblemenre enlazadas. 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) .
E N D
Colas y Listas Enlazadas Colas Listas Enlazadas Colas doblemenre enlazadas
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).
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
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?
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
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?
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()
Implementando Pilas y Colas con Deques Pilas con Deques: Colas con Deques:
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.
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 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.
Implementación de Deques con Listas Doblemente Enlazadas (2) Visualización del código para removeLast().