Pilas, Colas Estructuras de Datos Andrea Rueda Pontificia Universidad Javeriana Departamento de Ingeniería de Sistemas Quiz: STL Quiz: STL Standard Template Library (STL) std::vector - Arreglo dinámico, crece en memoria según necesidad. - Acceso aleatorio con operador [] (sobrecargado). - Inserción y eliminación directa sólo en el final (cola) del arreglo. www.cplusplus.com/reference/vector/vector Quiz: STL #include <vector> #include <iostream> int main() { std::vector<int> arr; for (int i=0; i<6; i++) 1. Insertar algunos datos... arr.push_back(10­i); for (int ind=0; ind<arr.size(); ind++) 2. Imprimir los datos insertados en pantalla... std::cout << arr[ind] << " "; std::cout << std::endl; } Quiz: STL Standard Template Library (STL) std::deque - Cola de dos cabezas, arreglo dinámico que crece por ambos extremos. - Acceso aleatorio con operador [] (sobrecargado). - Inserción y eliminación directa tanto en la cabeza como en la cola. www.cplusplus.com/reference/deque/deque Quiz: STL #include <iostream> #include <deque> int main() { std::deque<int> dcola; for (int i=0; i<3; i++) { 3. Insertar algunos datos dcola.push_back(i); dcola.push_front(10­i); en ambos extremos... } for (int ind=0; ind<dcola.size(); ind++) 4. Imprimir los datos insertados en pantalla... std::cout << dcola[ind] << " "; std::cout << std::endl; } Quiz: STL Standard Template Library (STL) std::list - Lista doblemente encadenada, conexión al siguiente y al anterior. - Acceso directo a cabeza y cola, otros elementos a través de iteradores. - Inserción y eliminación directa tanto en la cabeza como en la cola. www.cplusplus.com/reference/list/list Quiz: STL #include <iostream> #include <list> int main() { std::list<int> lista; for (int i=0; i<3; i++) { lista.push_back(i); 5. Insertar algunos datos lista.push_front(10­i); en ambos extremos... } std::list<int>::iterator it; for (it=lista.begin(); it!=lista.end(); it++) 6. Imprimir los datos insertados en pantalla... std::cout << *it << " "; std::cout << std::endl; } Quiz: STL - vector #include <vector> #include <iostream> int main() { std::vector<int> arr; for (int i=0; i<6; i++) arr.push_back(10­i); for (int ind=0; ind<arr.size(); ind++) std::cout << arr[ind] << " "; std::cout << std::endl; } Quiz: STL - deque #include <iostream> #include <deque> int main() { std::deque<int> dcola; for (int i=0; i<3; i++) { dcola.push_back(i); dcola.push_front(10­i); } for (int ind=0; ind<dcola.size(); ind++) std::cout << dcola[ind] << " "; std::cout << std::endl; } Quiz: STL - list #include <iostream> #include <list> int main() { std::list<int> lista; for (int i=0; i<3; i++) { lista.push_back(i); lista.push_front(10­i); } std::list<int>::iterator it; for (it=lista.begin(); it!=lista.end(); it++) std::cout << *it << " "; std::cout << std::endl; } TAD Pila TAD Cola Pilas y colas ● ● Listas: propósito general (secuencias). ¿Qué pasa cuando no sólo la secuencia es importante, sino el orden de llegada? Pila ● ● Colección ordenada de elementos con restricciones de acceso. Sus elementos sólo pueden accederse por un único lugar, el tope o cima de la pila. Novela Enciclopedia Revista Libro Diccionario Pila ● ● Entradas deben ser eliminadas en el orden inverso al que se situaron en la pila. “último en entrar, primero en salir” → estructura de datos LIFO (last-in, first-out). insertar eliminar cima (tope) fondo Pila Operaciones principales: ● Insertar (push): Añade un elemento y lo ubica en el tope de la pila. ● Eliminar (pop): Extrae el elemento en el tope y lo retira de la pila. Pila ● Implementaciones: – Arreglos (implementación estática). cima (tope) pila vacía puntero = -1 puntero de la pila pila llena puntero = 6 Pila ● Implementaciones: – Listas enlazadas (implementación dinámica). cima (tope) TAD Pila ● Secuencia finita de datos. – ● ● Acceso sólo al elemento tope. insertar eliminar cima (tope) Sin recorridos, acceso aleatorio restringido. Algoritmos: – Insertar, eliminar. – Vacía, tope. fondo ¿Estado? ¿Interfaz? TAD Pila TAD Pila Conjunto mínimo de datos: Comportamiento (operaciones) del objeto: TAD Pila TAD Pila Conjunto mínimo de datos: - tope, ?, representa el tope (elemento accesible). Comportamiento (operaciones) del objeto: - esVacia(), indica si la pila está vacía. - tope(), retorna el elemento en el tope. - insertar(v), inserta v en la pila. - eliminar(), elimina el elemento en el tope. Pila en STL Stack (std::stack) ● No se puede iterar (¿Por qué?) ● push (push_back) ● pop (pop_back) ● top (back) ● size ● empty www.cplusplus.com/reference/stack/stack Pila en STL std::stack< int > aux; Declaración for (int i = 0; i < 12; i++) aux.push( i+1 ); Inserción de datos while( !aux.empty( ) ) { int n = aux.top( ); aux.pop( ); Extracción de datos std::cout << n << std::endl; } Pila en STL std::stack< int > aux; for (int i = 0; i < 12; i++) aux.push( i+1 ); while( !aux.empty( ) ) { int n = aux.top( ); aux.pop( ); std::cout << n << std::endl; } Cola ● ● Colección de elementos almacenados en una lista con restricciones de acceso. Los elementos sólo pueden ser insertados en la cola (final) de la lista, y sólo pueden ser eliminados por la cabeza (inicio o frente) de la lista . 1° 2° 3° 4° Ult cabeza cola Cola ● ● ● Entradas deben ser eliminadas en el mismo orden en el que se situaron en la cola. “primero en entrar, primero en salir” → estructura de datos FIFO (first-in, first-out). Ejemplos: – Atención a clientes en un almacén. – Gestión de trabajos en una impresora. https://www.citrix.com/blogs/2013/06/28/efficient-queuing-but-where/ Cola Operaciones principales: ● Insertar (push): Añadir un elemento por el extremo final de la cola. ● Eliminar (pop): Extraer el elemento ubicado en el extremo inicial de la cola . Cola ● Implementaciones: - Arreglos (implementación estática). La cola no puede crecer indefinidamente, requiere un indicador de tamaño máximo. cabeza cola tamaño máximo Cola ● Implementaciones: - Arreglos (implementación estática). después de insertar cabeza cola tamaño máximo cola tamaño máximo después de eliminar cabeza Cola ● Implementaciones: - Arreglo circular (implementación estática). Se une el extremo final del arreglo con su extremo cabeza, para evitar las posiciones libres al inicio. http://pages.cpsc.ucalgary.ca/~jacobs/Courses/cpsc331/F10/tutorials/tutorial8.html Cola ● Implementaciones: - Lista enlazada (implementación dinámica). cabeza cola TAD Cola ● Secuencia finita de datos. – Inserción por un extremo, eliminación por el otro. ● Sin recorridos, acceso aleatorio restringido ● Algoritmos: – Insertar, eliminar. – Vacía, cabeza. cabeza ¿Estado? ¿Interfaz? cola TAD Cola TAD Cola Conjunto mínimo de datos: Comportamiento (operaciones) del objeto: TAD Cola TAD Cola Conjunto mínimo de datos: - cabeza, ?, representa el extremo inicial. - cola, ?, representa el extremo final. Comportamiento (operaciones) del objeto: - esVacia(), indica si la cola está vacía. - cabeza(), retorna el elemento en la cabeza. - insertar(v), inserta v en la cola. - eliminar(), elimina el elemento en la cabeza. Cola en STL Queue (std::queue) ● No se puede iterar (¿Por qué?) ● push (push_back) ● pop (pop_front) ● front ● back ● size ● empty www.cplusplus.com/reference/queue/queue Cola en STL std::queue< int > aux; Declaración for (int i = 0; i < 12; i++) aux.push( i+1 ); Inserción de datos while( !aux.empty( ) ) { int n = aux.front( ); aux.pop( ); Extracción de datos std::cout << n << std::endl; } Cola en STL std::queue< int > aux; for (int i = 0; i < 12; i++) aux.push( i+1 ); while( !aux.empty( ) ) { int n = aux.front( ); aux.pop( ); std::cout << n << std::endl; } Revisemos: Consideraciones de diseño e implementación de TADs Diseño de TADs ● Plantilla base para diseño de TADs: TAD nombre Conjunto mínimo de datos: nombre valor (variable), tipo de dato, descripción ... Comportamiento (operaciones) del objeto: nombre operación (argumentos), descripción funcional ... Diseño de TADs ● Diagrama de relación entre TADs: TAD 1 TAD 2 dato1 dato2 dato1 dato2 operacion1 operacion2 operacion3 operacion1 operacion2 TAD 3 Atención! No es un diagrama de clases! dato1 dato2 operacion1 Implementación de TADs ● Sintaxis básica, 2 archivos: - Encabezado (.h): Incluye la definición del TAD, en términos de datos y prototipos de operaciones. #include “TAD.hxx” (al final de la declaración) - Implementación (.hpp, .hxx): Incluye la implementación específica de las operaciones del TAD. #include “TAD.h” (al principio del archivo) Implementación de TADs ● Implementación (opción 1): datos en estructura, operaciones como funciones adicionales. struct Carrera{ std::string nombre; unsigned long numEst; }; std::string ObtenerNombre(Carrera *c); unsigned long ObtenerNumEst(Carrera *c); void FijarNombre(Carrera *c, std::string nombre); void AgregarEstud(Carrera *c); void EliminarEstud(Carrera *c); Implementación de TADs ● Implementación (opción 2): datos y operaciones en estructura. struct Carrera{ std::string nombre; unsigned long numEst; std::string ObtenerNombre(); unsigned long ObtenerNumEst(); void FijarNombre(std::string nombre); void AgregarEstud(); void EliminarEstud(); }; Implementación de TADs ● Implementación a usar (opción 3): Datos y operaciones dentro de una clase. class Carrera { public: Carrera(); std::string ObtenerNombre(); unsigned long ObtenerNumEst(); void FijarNombre(std::string name); void AgregarEstud(); void EliminarEstud(); protected: std::string nombre; unsigned long numEst; }; Implementación de TADs ● Sintaxis básica en encabezado: - Regiones: – Públicas (public): accesible por cualquiera. – Protegidas (protected): públicas para clases derivadas, privadas para funciones externas. – Privadas (private): accesible sólo por los miembros de la clase y por objetos de la misma clase. Implementación de TADs ● Sintaxis básica en encabezado: - Regiones: – Públicas (public): Todas las operaciones del TAD. Dan acceso a los datos (atributos) del TAD. – Protegidas (protected) o Privadas (private): Todos los datos (atributos) del TAD. Diseño e implementación de TADs 1.Diseñar el TAD: descripción + diagrama. 2.Escribir el archivo de encabezado (.h): un archivo por TAD. 3.Escribir el archivo de implementación (.hxx, .hpp): un archivo por TAD. 4.Escribir el archivo de programa (.cxx, .cpp): programa con procedimiento principal, incluye el encabezado de cada TAD a utilizar. Ejercicio ● Carreras por facultades en una universidad : Ingeniería Ciencias Básicas Artes Civil Biología Arquitectura Electrónica Sistemas Música Ciencias Sociales Composición ● Ejemplo: carreras por facultades en una universidad. class Carrera { public: Carrera(); std::string ObtenerNombre(); unsigned long ObtenerNumEst(); void FijarNombre(std::string name); void AgregarEstud(); void EliminarEstud(); protected: std::string nombre; unsigned long numEst; }; Composición ● Ejemplo: carreras por facultades en una universidad. class Facultad { public: Facultad(); std::string ObtenerNombre(); void FijarNombre(std::string nombre); void AgregarCarrera(std::string carrera, unsigned long numEst); unsigned long ContarEstud(); bool EliminarCarrera(std::string carrera); protected: std::string nombre; std::list<Carrera> lCarreras; }; Composición ● Ejemplo: carreras por facultades en una universidad. class Universidad { public: Universidad(); void AgregarCarrera(std::string carrera, std::string fac, unsigned long numEst); unsigned long ContarEstud(); void EliminarCarrera(std::string carrera); protected: std::list<Facultad> lFacs; }; Referencias ● L. Joyanes Aguilar, I. Zahonero. Algoritmos y estructuras de datos: una perspectiva en C. McGraw-Hill, 2004. ● www.sgi.com/tech/stl ● www.cplusplus.com