Tema 7. Colas. José M. Badía, Begoña Martínez, Antonio Morales y José M. Badía. {badia, bmartine,

Documentos relacionados
Tema 8. Listas. José M. Badía, Begoña Martínez, Antonio Morales y José M. Sanchiz

Tema 6. Gestión dinámica de memoria

Tema 5. Estructura de datos Pila

Listas, pilas, colas

Pilas, Colas. Andrea Rueda. Estructuras de Datos. Pontificia Universidad Javeriana Departamento de Ingeniería de Sistemas

Tema 2. Tipos y Estructuras Básicas

CONTENEDORES DE LA BIBLIOTECA

Ingeniera de Sistemas: Luz Esperanza Espitia Tutora de Estructura de datos.

Tipos de Datos Abstractos TDA COLA. Representación de una cola

Estructuras de Datos Clase 4 Pilas y colas

Estructura de Datos. Unidad de Aprendizaje: Unidad de Competencia II: Estructuras de Datos Lineales. M. en C. Edith Cristina Herrera Luna

GESTIÓN DE MEMORIA DINÁMICA

Estructura de datos y algoritmos. Tema IV: TIPOS DE DATOS ABSTRACTOS DINÁMICOS LINEALES

UNIVERSIDAD AUTONOMA DE MADRID ESCUELA POLITÉCNICA SUPERIOR ESTRUCTURAS DE DATOS Y ALGORITMOS

TAD Lineales: Pila, Cola y Lista

Estructuras de Datos

Algoritmos y Estructuras de Datos Pilas LIFO y Colas FIFO. Guillermo Román Díez

Tema: Plantillas en C++.

Estructuras Enlazadas AyED UTN-BA

3.3. PILAS 1. stack(const queue &original); /* Pre: cierto */ /* Post: Construye una pila que es una copia de "original". */

INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS

Tema: Tipos Abstractos de Datos (TAD s) en C++.

CLASE 10 - ESTRUCTURAS DE DATOS DINÁMICAS

Librerías estándar en C++ STL: Standard Template Library. Álvaro Sánchez Miralles José Porras (Fidel Fernández)

ÁRBOL BINARIO. T der. Árbol binario homogéneo es aquel cuyos nodos tienen grado 0 ó 2(no hay ninguno de grado 1).

Tema 03: TAD Cola. M. en C. Edgardo Adrián Franco Martínez edgardoadrianfrancom

PROGRAMACIÓN N C++ CONSTRUCTORES PROG.C++ L11 CONSTRUCTORES DEL LENGUAJE

3.3. Pilas 3.3. PILAS 3

Profesor: José Miguel Rubio L.

Tema 11. Estructura de datos Grafo

Estructura de datos Colas

Tipos de Datos Recursivos

Programación de sistemas Pilas y Colas

Un hombre caminaba por el bosque cuando vió una zorra lisiada. " Cómo hará para alimentarse?", pensó.

Informática Industrial I

Impresión por pantalla. 3. Indicar la salida por pantalla (2 puntos-20 minutos)

IMPLEMENTACIÓN DE PILAS CON LISTAS EN C++

Capítulo. Listas, pilas y colas en C++ Contenido. Introducción

Implementación de las Clases Pila, Cola, Lista y Arbol

Segundo Parcial de Programación 2 7 de junio de 2017

Solución práctico 6 Tipos Abstractos de Datos Lista, Pila y Cola

Programación C++ Tipos Parametrizados. Dr. Oldemar Rodríguez Rojas Escuela de Informática Universidad Nacional

PILAS. Prof. Ing. M.Sc. Fulbia Torres

Plantillas (Templates)

Unidad III: Estructuras lineales

Tema 04: TAD Lista. M. en C. Edgardo Adrián Franco Martínez edgardoadrianfrancom

Programación Avanzada CONCEPTOS BÁSICOS DE IMPLEMENTACIÓN EN C++

Tipos de Datos Abstractos

Algoritmos y Estructuras de Datos Ingeniería en Informática, Curso 2º SEMINARIO DE C++ Sesión 2

STL: Standard Template Library

Implementación de las Clases Pila, Cola, Lista y Arbol

LISTAS. Prof. Ing. M.Sc. Fulbia Torres

Asignación Dinámica de Memoria. Agustín J. González Versión original de Kip Irvine ELO 326: Seminario II 2do. Sem. 2001

APUNTES PROII 2º PARCIAL.

Estructuras de Datos Clase 4 Pilas y colas

Tipos Recursivos de Datos

Creación de clases en C++ (II)

Algoritmos y Estructuras de Datos Ingeniería en Informática, Curso 2º SEMINARIO DE C++ Sesión 3

Tema: Sobrecarga de Operadores Unarios. Sobrecarga de Funciones.

ELO329: Diseño y Programación Orientados a Objetos 20 de Junio de Certamen Final

ESTRUCTURAS DINÁMICAS DE DATOS (COLAS) EN C

STL: Standard Template Library

PROGRAMACIÓN ORIENTADA A OBJETOS

ÍNDICE 1. Índice Listas ordenadas Operaciones permitidas Pilas Operaciones permitidas...

EDA. Tema 8 Colas de Prioridad: Heaps

Programación de sistemas

PUBLICACIÓN DEL ENUNCIADO: Semana del 10 de noviembre de ENTREGA: Clase de laboratorio de la semana del 8 de diciembre de 2003.

12. COLAS Introducción Fundamentos

Tema 8- Implementación de Pila, Cola y. Tema 8- Implementación de Pila, Cola y Lista con Punto de Interés. Representación Eficaz de una EDA

Universidad Autónoma del Estado de México 2016, Año del 60 Aniversario de la Universidad Autónoma del Estado de México

Arboles Binarios de Búsqueda en C++

Algoritmos y Estructuras de Datos Ingeniería en Informática, Curso 2º SEMINARIO DE C++ Sesión 1

Manejo de Punteros y objetos en memoria dinámica en C++ Agustín J. González ELO 329

Una lista de operadores que pueden o no sobrecargarse es la siguiente: Operadores que pueden sobrecargarse

Programación 1 Tema 2. Lenguaje de programación y ejecución de un programa

Estructuras de Datos Lineales y Arborescentes

Programación 1 Tema 3. Información, datos, operaciones y expresiones

PILAS Fundamentos

Programación C++(3 Parte) Dr. Oldemar Rodríguez Rojas Maestría en Computación Universidad de Costa Rica

Biblioteca de templates. template <typename T> void eliminar(t arr[], int& len, int pos);

Programación Orientada o Objetos

Tema 3. Análisis de costes

Tema: Estructura Pila.

Introducción a C++ Índice

Hoja de ejercicios del Tema 9

Tema 14: ÁRBOLES Algoritmos y estructuras de datos I - Tema 14 1

Estructuras de Datos Dinámicas: Tipo de Dato Abstracto parte I. Programación I Departamento de Informática Universidad Nacional de San Luis Argentina

Las FILAS. ING PEDRO BELTRÁN CANESSA Estructuras de Datos 1

Tema: Tipos Abstractos de Datos (TAD s) en C#.

ESTRUCTURAS DINÁMICAS DE DATOS (PILAS)

Tema 6: Memoria dinámica

Apuntes de Clases (continuación)

Templates. template <class T> T max(const T &t1, const T &t2) { return ((t2 > t1)? t2 : t1); }

Tema 2: Clases y Objetos

Programación de Sistemas GIT, GISC, GISA, GITT

Transcripción:

Tema 7. Colas http://aulavirtual.uji.es José M. Badía, Begoña Martínez, Antonio Morales y José M. Badía {badia, bmartine, morales}@icc.uji.es Estructuras de datos y de la información Universitat Jaume I

Índice 1. Definición y aplicaciones 5 2. Tipo Abstracto de Datos cola 7 3. La clase queue 8 4. Cola con un vector 11 5. Cola enlazada 17 6. Colas con prioridad 19 7. Bicolas 24

Bibliografía (Nyhoff 06), capítulo 8. (Orallo 02), capítulo 21. Using the STL, the C++ Standard Template Library. R. Robson. Springer, Segunda Edición, 1999. Capítulo 9. Tema 7. Colas 3 / 28

Objetivos Conocer el concepto, funcionamiento y aplicaciones de tipo cola. Conocer el TAD cola y sus operaciones asociadas. Saber usar el tipo cola para resolver problemas. Saber implementar el tipo cola mediante vectores y nodos enlazados. Conocer variantes de cola como la cola con prioridad y la bicola. Conocer y saber usar los contenedores queue, priority_queue y deque de la STL. Tema 7. Colas 4 / 28

1 Definición y aplicaciones Definición Cola estructura de datos lineal donde las inserciones y extraciones de datos se realizan siguiendo una política FIFO (first in first out). Primer dato en entrar es el primer dato en salir. Características Homogénea: todos los elementos de la cola son del mismo tipo. Existe un orden de elementos ya que es una estructura lineal, pero los elementos no están ordenados por su valor, sino por orden de introducción en la cola. Existen dos extremos en la estructura lineal cola, el frente y el final de la cola. Sólo se puede acceder y eliminar al dato que está en el frente de la cola. Sólo se puede añadir información al final de la cola. Tema 7. Colas 5 / 28

1 Definición y aplicaciones (II) Operaciones de manipulación: Añadir: Añade un elemento al final de la cola. Eliminar: Elimina el elemento del frente de la cola. X F G A H X F G A L X F G A L X F G M L X F G M L X F Ejemplos: cola de clientes esperando pagar en una caja de supermercado, cola de clientes esperando ser atendidos por algún cajero en un banco, cola de procesos esperando ser ejecutados por una CPU. Al igual que la pila, la cola es una estructura de datos dinámica. Tema 7. Colas 6 / 28

2 Tipo Abstracto de Datos cola TAD cola Usa logico, tipobase Operaciones: CrearCola: cola ColaVacia: cola logico Frente: cola tipobase Añadir: cola x tipobase cola Eliminar: cola cola Axiomas: Q cola, e tipobase, 1) ColaVacia(CrearCola) = verdadero 2) ColaVacia(Añadir(Q,e)) = falso 3) Eliminar(CrearCola) = error 4) Eliminar(Añadir(CrearCola,e)) = CrearCola 5) Eliminar(Añadir(Q,e)) = Añadir(Eliminar(Q),e) 6) Frente(CrearCola) = error 7) Frente(Añadir(CrearCola,e)) = e 8) Frente(Añadir(Q,e)) = Frente(Q) Tema 7. Colas 7 / 28

3 La clase queue queue es una clase definida en la STL. Según las nomenclatura de la STL, queue es un adaptador, es decir, un contenedor que se basa en otro contenedor más versátil, y que define nuevas operaciones que son normalmente un subconjunto de las del contenedor en que se basa. Un contenedor es una clase para contener (guardar) una colección de datos según una determinada política de acceso. Por ejemplo, contenedores de la STL son vector, list, deque, string, entre otros. Las clases stack y queue son adaptadores. Ambos se basan en el contenedor deque, del que hablaremos más adelante. Otro adaptador de la STL que estudiaremos es priority_queue. Tema 7. Colas 8 / 28

3 La clase queue (II) La clase queue será: typedef i n t tipobase ; class queue { public : queue ( ) ; bool empty ( ) const ; const tipobase & f r o n t ( ) const ; void push ( const tipobase & x ) ; void pop ( ) ; private :... } ; Tema 7. Colas 9 / 28

3 La clase queue (III) Ejemplo de utilización: #include <queue> # include < iostream > using namespace std ; void main ( ) { } queue q1 ; i n t i ; Tema 7. Colas 10 / 28 for ( i = 0 ; i <10; i ++) q1. push ( i ) ; while (! q1. empty ( ) ) { } cout < < q1. f r o n t ( ) < < ; q1. pop ( ) ; cout < < endl ;

4 Cola con un vector Los elementos de la cola se guardan en un vector. El frente y el final de la cola son índices del vector. frente 1 5 final elementos 3 8 2 10 frente apunta a la posición anterior a donde está el primer elemento de la cola. final apunta a la posición donde está el último elemento. Primera opción: Vector lineal. Cola llena: final apunta a la última posición del vector. Problema: puede desaprovecharse mucho espacio. Tema 7. Colas 11 / 28

4 Cola con un vector (II) Segunda opción: Vector circular 0 1 2 capacidad 1... Cómo se desplazan los índices frente y final? f r e n t e = ( f r e n t e +1) % capacidad ; f i n a l = ( f i n a l +1) % capacidad ; La función privada int Siguiente(int) facilitará los incrementos. Tema 7. Colas 12 / 28

4 Cola con un vector (III) frente = final 8 1 10 3 9 12 5 0 7 4 La cola está llena o vacía? Para evitar esta ambigüedad se puede: Llevar un contador del número de elementos en la cola. No dejar que la cola se llene del todo, dejando al menos una posición libre. Tomaremos esta segunda opción para nuestra implementación, por ser más simple. Tema 7. Colas 13 / 28

4 Cola con un vector (IV) typedef i n t tipobase ; class queue { public : queue ( i n t n =256); queue ( ) ; queue ( const queue & origen ) ; / / c o n s t r u c t o r de copia queue & operator =( const queue & origen ) ; / / Op. asignación bool f u l l ( ) const ; bool empty ( ) const ; const tipobase & f r o n t ( ) const ; void push ( const tipobase & x ) ; void pop ( ) ; Tema 7. Colas 14 / 28

4 Cola con un vector (V) private : i n t s i g u i e n t e ( i n t i ) const { return ( ( i +1) % capacidad ) ; } i n t f r e n t e, f i n a l ; T elementos ; i n t capacidad ; } ; Tratamiento de errores: Es responsabilidad del programador llamar a empty() antes de llamar a front() o pop(), y a full() antes de llamar a push(). Tema 7. Colas 15 / 28

4 Cola con un vector (VI) queue ( i n t n ) { capacidad = n ; elementos = new tipobase [ capacidad ] ; f r e n t e = 0 ; / / por ejemplo f i n a l = 0 ; / / ha ser i g u a l a f r e n t e } queue ( ) { } delete [ ] elementos ; Escribe el código del constructor de copia y del operador de asignación. Tema 7. Colas 16 / 28

5 Cola enlazada Cola: secuencia de nodos enlazados. frente y final son punteros al primer y último nodo. Definimos la clase nodo como: class nodo { public : tipobase i n f o ; nodo s i g ; / / c o n s t r u c t o r nodo ( const tipobase & v a l o r =tipobase ( ), nodo signodo=null ) : i n f o ( v a l o r ), s i g ( s i g u i e n t e ) { } } ; Tema 7. Colas 17 / 28

5 Cola enlazada (II) Clase cola enlazada: typedef i n t tipobase ; class queue { public : / / c o n s t r u c t o r e s y d e s t r u c t o r e s / / operaciones : empty, f r o n t, push, pop private : class nodo { / / datos y c o n s t r u c t o r } ; nodo f r e n t e ; nodo f i n a l ; } ; Tema 7. Colas 18 / 28

6 Colas con prioridad Colas con prioridad: los elementos tienen asociada una prioridad. Comportamiento: Los elementos más prioritarios salen primero. A igual prioridad, política FIFO. Ejemplo: consulta médica. Prioridad: estado del paciente. Implementación: m x a v grave grave moderado leve............ frente b grave... Implementación: Se usan montículos (heaps): un tipo de árbol binario (tema 10). STL: priority_queue. Tema 7. Colas 19 / 28

6 Colas con prioridad (II) La interfaz de la clase priority_queue es similar a la de la clase queue, pero: Se debe proporcionar el operador < del tipo base, en caso de que no esté ya definido. Se puede especificar otra función de comparación distinta. De hecho, la plantilla de priority_queue está definida como: template < class T, class Sequence=vector <T>, class Compare= l e s s <typename Sequence : : value_type > > Es decir, la secuencia básica es un vector, pues un vector es muy adecuado para implementar un montículo, como se verá en su momento. Y la función de comparación es la función less, que a su vez se basa en el operador <. Tema 7. Colas 20 / 28

6 Colas con prioridad (III) template < class T, Sequence=vector <T>, class Compare= l e s s <typename Sequence : : value_type > > class p r i o r i t y _ q u e u e { public : typedef typename Sequence : : value_type value_type ; typedef typename Sequence : : size_type size_type ; typedef typename Sequence : : reference reference ; typedef typename Sequence : : const_reference const_reference ; protected : Sequence c ; Compare comp ; public : p r i o r i t y _ q u e u e ( ) ; p r i o r i t y _ q u e u e ( const Compare & x ) ; bool empty ( ) const ; size_type size ( ) ; const_reference top ( ) ; void push ( const value_type & x ) ; void pop ( ) ; } ; / / class Tema 7. Colas 21 / 28

6 Colas con prioridad (IV) Ejemplo de uso: #include < s t r i n g > using namespace std ; class Persona { public : s t r i n g nombre ; i n t edad ; Persona ( s t r i n g nmbr, i n t ed ) ; friend bool operator <( const Persona &p1, const Persona &p2 ) ; friend bool operator ==( const Persona &p1, const Persona &p2 ) ; } ; bool operator <( const Persona & p1, const Persona & p2 ) { return ( p1. edad < p2. edad ) ; } bool operator ==( const Persona & p1, const Persona & p2 ) { return ( p1. edad = = p2. edad ) ; } Tema 7. Colas 22 / 28

6 Colas con prioridad (V) # include < iostream > #include <queue> using namespace std ; void main ( ) { p r i o r i t y _ q u e u e <Persona > pq ; pq. push ( Persona ( Andres, 1 4 ) ) ; pq. push ( Persona ( Marta, 7 ) ) ; pq. push ( Persona ( I s a b e l, 1 2 ) ) ; pq. push ( Persona ( Daniel, 1 3 ) ) ; while (! pq. empty ( ) ) { cout < < ( pq. top ( ) ). nombre < < ", " < < ( pq. top ( ) ). edad < < endl ; pq. pop ( ) ; } } Tema 7. Colas 23 / 28

7 Bicolas Bicola: cola en la que se pueden realizar inserciones y extracciones por ambos lados. Bicola en la STL: contenedor deque. Sobre él están basados los adaptadores stack y queue. Implementación: deque permite acceder en tiempo constante a cualquier elemento, como un vector, e implementa una complicada gestión dinámica de memoria que queda fuera del ámbito de la asignatura. Tema 7. Colas 24 / 28

7 Bicolas (II) class deque { public : deque ( ) ; deque ( ) ; bool empty ( ) const ; size_type size ( ) const ; const tipobase & f r o n t ( ) const ; const tipobase & back ( ) const ; void push_front ( const tipobase & x ) ; void push_back ( const tipobase & x ) ; void pop_front ( ) ; void pop_back ( ) ;... } ; Tema 7. Colas 25 / 28

7 Bicolas (III) Las pilas (stack) y colas (queue) pueden verse como bicolas (deque) con restricciones de acceso. En la STL, las clases stack y queue se implementan usando la clase deque. Son adaptadores. Podrían implementarse en base a otras secuencias: listas, vectores, etc. Tema 7. Colas 26 / 28

7 Bicolas (IV) template < class T, class Sequence = deque<t> > class stack { friend bool operator ==( const stack &x, const stack & y ) ; friend bool operator <( const stack &x, const stack & y ) ; public : typedef typename Sequence : : value_type value_type ; typedef typename Sequence : : size_type size_type ; typedef typename Sequence : : reference reference ; typedef typename Sequence : : const_reference const_reference ; protected : Sequence c ; public : bool empty ( ) const { return c. empty ( ) ; } size_type size ( ) const { return c. s ize ( ) ; } reference top ( ) { return c. back ( ) ; } const_reference top ( ) const { return c. back ( ) ; } void push ( const value_type & x ) { c. push_back ( x ) ; } void pop ( ) { c. pop_back ( ) ; } } ; / / de l a clase Tema 7. Colas 27 / 28

7 Bicolas (V) template < class T, class Sequence = deque<t> > class queue { friend bool operator ==( const queue &x, const queue & y ) ; friend bool operator <( const queue &x, const queue & y ) ; public :... protected : Sequence c ; public : bool empty ( ) const { return c. empty ( ) ; } size_type size ( ) const { return c. s ize ( ) ; } reference f r o n t ( ) { return c. f r o n t ( ) ; } const_reference f r o n t ( ) const { return c. f r o n t ( ) ; } reference back ( ) { return c. back ( ) ; } const_reference back ( ) const { return c. back ( ) ; } void push ( const value_type & x ) { c. push_back ( x ) ; } void pop ( ) { c. pop_front ( ) ; } } ; Tema 7. Colas 28 / 28