Download Colas - WordPress.com
Document related concepts
no text concepts found
Transcript
ESTRUCTURA DE DATOS Adaptadores de contenedores: pilas, colas, colas de prioridad PILA • Es una estructura de datos en la cual la inserción y borrado de nuevos elementos se realiza sólo por un extremo llamado cima o tope. • Son estructuras utilizadas muy a menudo como herramientas de programación de tipo LIFO (Last inFirst out) • Permiten el acceso solo a un elemento a la vez: el último elemento insertado • La mayoría de los procesadores utilizan una arquitectura basada en pilas EJEMPLOS DE PILAS • Pila de platos • Pila de bandejas • Pila de monedas CARACTERISTICAS DE UNA PILA • Es una estructura de datos dinámica. • Es una estructura tipo LIFO (Last In, First Out) • El tipo de datos PILA, no existe como tal en ningún lenguaje, por lo cual se hace necesario implementarlo mediante las herramientas del lenguaje de programación. OPERACIONES DE UNA PILA • CREAR: Se usa para inicializar o preparar la pila. • ENTRAR (PUSH): Introduce un elemento a la pila. • SACAR (POP): Eliminar un elemento de la pila. • PILAVACIA: Se usa para comprobar si la pila está vacía. • PILALLENA: Se usa en el caso de que la pila sea implementada en un arreglo y tiene el fin de comprobar si la pila no está desbordando los límites del arreglo. OPERACIONES DE UNA PILA ENTRAR (PUSH) OPERACIONES DE UNA PILA SACAR (POP) IMPLEMENTACION DE UNA PILA • Pilas alojadas en arreglos. • Pilas con punteros. USOS DE LAS PILAS • Compiladores. • Sistemas operativos. • Programas de aplicación. Pilas - Eficiencia • El tiempo de ejecución de las operaciones primarias de una pila no depende del tamaño de la pila • Push y Pop se realizan en tiempo constante O(1) - no es necesario hacer ninguna comparación Pilas: código en JAVA • En JAVA para trabajar con pilas se usa la clase Stack (java.util.Stack). A continuacion el comando para crear una pila: Stack pila = new Stack(); Los métodos mas usados en las pilas son: – push() “empuja” un objeto al tope del stack. – peek() regresa el objeto en el tope del stack pero sin sacarlo. – pop() regresa el objeto en el tope del stack, removiéndolo. – search() Se puede buscar un objeto dentro del stack para obtener su índice utilizando dicho método. Ejemplos de pilas Stack pila = new Stack(); pila.push("1"); pila.push("2"); pila.push("3"); //observar el elemento en el tope del stack sin sacarlo. Object objTop = pila.peek(); Object obj3 = pila.pop(); //la cadena "3" está en el tope del stack. Object obj2 = pila.pop(); //la cadena "2" está en el tope del stack. Object obj1 = pila.pop(); //la cadena "1" está en el tope del stack. int index = pila.search("3"); //index = 3 COLA Es una estructura de datos en la cual la inserción de elementos se hacen por un extremo (llamado FINAL) y las eliminaciones se hacen por otro extremo (llamado FRENTE). EJEMPLOS DE COLAS • Fila de personas • Una caravana de carros • Lista de archivos a ser impresos CARACTERISTICAS DE UNA COLA • Es una estructura de datos dinámica. • Es una estructura tipo FIFO (FIRST IN, FIRST OUT) • El tipo de datos COLA, no existe como tal en ningún lenguaje, por lo cual se hace necesario implementarlo mediante las herramientas del lenguaje de programación. TIPOS DE COLAS • Cola simple: Estructura lineal donde los elementos salen en el mismo orden en que llegan.‡ • Cola circular: Representación lógica de una cola simple en un arreglo.‡ • Cola de Prioridades: Estructura lineal en la cual los elementos se insertan en cualquier posición de la cola y se remueven solamente por el frente.‡ • Cola Doble (Bicola): Estructura lineal en la que los elementos se pueden añadir o quitar por cualquier extremo de la cola (cola bidireccional) OPERACIONES DE UNA COLA • CREAR: Se usa para inicializar o preparar la cola. • ENTRAR (PUSH): Introduce un elemento a la cola. Este se agrega al FINAL. • SACAR (POP): Elimina un elemento de la cola. Se elimina por el FRENTE. • COLAVACIA: Se usa para comprobar si la cola está vacía. • COLALLENA: Se usa en el caso de que la cola sea implementada en un arreglo y tiene el fin de comprobar si la cola no está desbordando los límites del arreglo. OPERACIONES DE UNA COLA • ENTRAR (PUSH) OPERACIONES DE UNA COLA • SACAR(POP) IMPLEMENTACION DE UNA COLA • Colas alojadas en arreglos. • Colas con punteros. USOS DE LAS COLAS • Impresoras. • Administración de tareas. Colas - Eficiencia • El tiempo de ejecución de las operaciones primarias de una colas no depende del tamaño de la cola • Encolar y Desencolar se realizan en tiempo constante O(1) - no es necesario hacer ninguna comparación Colas: código en Java • La interfaz Queue (java.util.Queue) es un subtipo de la interfaz Collection, representa una lista ordenada de objetos justo como List pero su uso es ligéramente distinto. • Una cola está diseñada para tener sus elementos insertados al final de la cola y removidos del inicio. Justo como una fila de banco o de supermercado. • Al ser un subtipo de Collection, todos los métodos de Collection también se encuentran disponibles en la interfaz Queue. • Como Queue es una interfaz, es necesario instanciar una implementación concreta para poder utilizarla. • Existen 2 clases en el API de Java que implementan la interfaz Queue: – java.util.LinkedList – java.util.PriorityQueue • LinkedList es una implementación es una implementación estándar de una cola. • PriorityQueue guarda sus elementos internamente de acuerdo a su orden natural (si implementan la interfaz Comparable), o de acuerdo a un Comparador (Comparator) pasado a PriorityQueue. Aquí hay algunos ejemplos de cómo crear una instancia de Queue: Queue colaA = new LinkedList(); Queue colaB = new PriorityQueue(); • Para agregar elementos a una cola, se llama su método add(). Este método se hereda de la interfaz Collection: Queue colaA = new LinkedList(); colaA.add("elemento 1"); colaA.add("elemento 2"); colaA.add("elemento 3"); • El orden en el cual los elementos se agregan a Queue es almacenado internamente y depende de la implementación. Esto mismo es cierto para el orden en el cual los elementos son obtenidos (removidos) de la cola. • Se puede observar cuál es el elemento que se encuentra a la “cabeza” de la cola sin quitarlo utilizando el método element(): Object firstElement = queueA.element(); • Para quitar el primer elemento de la cola, se utiliza el método remove(). • Para remover (quitar) elementos de la cola, se llama el método remove(). Éste método quita el elemento que se encuentra a la “cabeza” de la cola: Object primerElemento = colaA.remove(); • También es posible iterar todos los elementos de la cola, en lugar de procesarlos uno a la vez: Queue colaA = new LinkedList(); colaA.add("elemento 0"); colaA.add("elemento 1"); colaA.add("elemento 2"); //acceso con iterador Iterator iterador = colaA.iterator(); while(iterador.hasNext(){ String elemento = (String) iterador.next(); } //acceso con ciclo for for(Object objecto : colaA) { String elemento = (String) objecto; } Cola de prioridad • Una cola de prioridades es una estructura de datos en la que los elementos se atienden en el orden indicado por una prioridad asociada a cada uno. • Si varios elementos tienen la misma prioridad, se atenderán de modo convencional según la posición que ocupen. Características generales • Este tipo especial de colas tienen las mismas operaciones que las colas , pero con la condición de que los elementos se atienden en orden de prioridad. • Ejemplos de la vida diaria serían la sala de urgencias de un hospital, ya que los enfermos se van atendiendo en función de la gravedad de su enfermedad. • Entendiendo la prioridad como un valor numérico y asignando a altas prioridades valores pequeños, las colas de prioridad nos permiten añadir elementos en cualquier orden y recuperarlos de menor a mayor. Implementación • Hay 2 formas de implementación: 1. Añadir un campo a cada nodo con su prioridad. Resulta conveniente mantener la cola ordenada por orden de prioridad. 2. Crear tantas colas como prioridades haya, y almacenar cada elemento en su cola. Tipos de cola de prioridad • Colas de prioridades con ordenamiento ascendente: en ellas los elementos se insertan de forma arbitraria, pero a la hora de extraerlos, se extrae el elemento de menor prioridad. • Colas de prioridades con ordenamiento descendente: son iguales que la colas de prioridad con ordenamiento ascendente, pero al extraer el elemento se extrae el de mayor prioridad. Operaciones Las operaciones de las colas de prioridad son las mismas que las de las colas genéricas: – Crear: se crea la cola vacía. – Añadir: se añade un elemento a la cola, con su correspondiente prioridad. – Eliminar: se elimina el elemento frontal de la cola. – Frente: se devuelve el elemento frontal de la cola. – Destruye: elimina la cola de memoria. Ejemplo de cola de prioridad import java.util.*; public class PriorityQueueDemo { public static void main(String args[]) { // create priority queue PriorityQueue < Integer > prq = new PriorityQueue < Integer > (); // insert values in the queue for ( int i = 0; i < 10; i++ ){ prq.add (new Integer (i)) ; } Ejemplo de cola de prioridad (cont.) // create iterator from the queue Iterator it = prq.iterator(); System.out.println ( "Priority queue values are: "); while (it.hasNext()){ System.out.println ( "Value: "+ it.next()); } } }