TAD Lineales: Pila, Cola y Lista Tema 2 Objetivos ! Dar a conocer los TAD lineales pila, cola y lista ! Presentar la especificación de cada uno de los TAD ! Discutir implementaciones alternativas para cada uno de ellos Contenidos 2.1 Introducción 2.2 El TAD Pila 2.2.1 Conceptos 2.2.2 Especificación algebraica 2.2.3 Implementación 2.2.4 Consideraciones sobre TAD basados en punteros 2.3 El TAD Cola 2.3.1 Conceptos 2.3.2 Especificación algebraica 2.3.3 Implementación Algoritmos y Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva 1 TAD Lineales: Pila, Cola y Lista Tema 2 Contenidos 2.4 El TAD Lista 2.4.1 Conceptos 2.4.2 Especificación algebraica 2.4.3 Implementación Duración ! 3 clases (4,5 h) Bibliografía ! Diseño de programas. Formalismo y abstracción Autor: Ricardo Peña Marí Editorial : Prentice-Hall, 1999 Págs. 227-234 ! Estructuras de datos. Algoritmos, abstracción y objetos Autor: Luis Joyanes Aguilar, Ignacio Zahonero Martínez Editorial: McGraw-Hill Págs. 153-226 Algoritmos y Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva 2 Tema 2 TAD Lineales: Pila, Cola y Lista 2.1 Introducción ! Estructuras lineales → importantes porque aparecen con frecuencia en muchos problemas ! Ejemplos: una cola de clientes de un banco, la pila de ejecución de un programa, los caracteres de una cadena o las páginas de un libro ! Características: ! existe un elemento llamado primero ! existe un elemento llamado último ! cada elemento, excepto el primero, tiene un único predecesor ! cada elemento, excepto el último, tiene un único sucesor Algoritmos y Estructuras de Datos II Tema 2 I.T. en Informática de Gestión/Sistemas Universidad de Huelva 3 TAD Lineales: Pila, Cola y Lista ! Operaciones básicas: ! crear la estructura vacía ! insertar un elemento ! borrar un elemento ! obtener un elemento ! Para definir claramente el comportamiento de la estructura es necesario determinar en qué posición se inserta un elemento nuevo y qué elemento se borra o se obtiene ! Principales estructuras lineales: pilas, colas y listas Algoritmos y Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva 4 TAD Pila Tema 2 2.2 El TAD Pila 2.2.1 Conceptos ! Una pila es un contenedor de objetos que son insertados y eliminados de acuerdo con el principio de que el último en entrar es el primero en salir (LIFO, Last Input First Output) Apilar Desapilar Cima de la pila ! Los elementos se insertan de uno en uno (apilar) ! Se sacan en el orden inverso al cual se han insertado (desapilar) ! El único elemento que se puede observar dentro de la pila es el último insertado (cima) Algoritmos y Estructuras de Datos II I.T. en Informática de Gestión/Sistemas a3 a2 a1 Universidad de Huelva 5 TAD Pila Tema 2 ! Aplicaciones: ! estructuras auxiliares en numerosos algoritmos y esquemas de programación: " recorridos de árboles y grafos " evaluación de expresiones " conversión entre notaciones de expresiones (postfija, prefija, infija) ! gestión de los registros de activación de los subprogramas activos durante la ejecución de un programa ! los editores de texto proporcionan normalmente un botón deshacer que cancela las operaciones de edición recientes y restablece el estado anterior del documento. La secuencia de operaciones recientes se mantiene en una pila ! los navegadores permiten habitualmente volver hacia atrás en la secuencia de páginas visitadas. Las direcciones de los sitios visitados se almacenan en una pila Algoritmos y Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva 6 TAD Pila Tema 2 2.2.2 Especificación algebraica espec pilas usa booleanos parámetro formal género elemento fpf género pila operaciones creaPila: # pila apilar: pila elemento # pila parcial desapilar: pila # pila parcial cima: pila # elemento vacía?: pila # booleano dominios de definición p: pila; e: elemento desapilar (apilar (p,e)) cima (apilar (p,e)) ecuaciones p: pila; e: elemento desapilar (apilar (p,e)) = p cima (apilar (p,e)) = e vacia? (crearPila) = verdad vacia? (apilar (p,e)) = falso fespec Algoritmos y Estructuras de Datos II Tema 2 Gen (pila) = {creaPila, apilar} Cons (pila) = Mod (pila) = {desapilar} Obs (pila) = {cima, vacía?} I.T. en Informática de Gestión/Sistemas Universidad de Huelva 7 TAD Pila ! El conjunto de generadoras es libre, ya que cualquier término formado por las operaciones generadoras denota siempre un valor distinto del TAD Pila ! Los patrones necesarios para representar todas las posibles pilas se obtienen del conjunto de las operaciones generadoras ! creaPila: representa la pila sin ningún elemento (pila vacía) ! apilar(p,e): representa cualquier pila con, al menos, un elemento ! Las operaciones desapilar y cima no están definidas para la pila vacía ! La parametrización en las especificaciones sirve para formular una descripción genérica, que podrá dar lugar a diversas especificaciones concretas Algoritmos y Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva 8 TAD Pila Tema 2 2.2.3 Implementación Mediante una tabla elementos e1 e2 e3 ... en ... 1 2 3 ... n ... indCima constante max = valor arbitrario fconstante; tipo pila = clase público constructor creaPila; acción apilar (e: elemento); acción desapilar; función cima: elemento; función esVacía: booleano privado elementos: tabla [1..max] de elemento; indCima: 0..max; fclase; n Algoritmos y Estructuras de Datos II I.T. en Informática de Gestión/Sistemas e2 e3 1 2 elementos indCima 9 en ... n Universidad de Huelva TAD Pila Tema 2 e1 max 3 ... ... n ... max constante max = valor arbitrario fconstante; tipo pila = clase público constructor creaPila; acción apilar (e: PtrElemento); acción desapilar; función cima: PtrElemento; función esVacía: booleano privado elementos: tabla [1..max] de PtrElemento; indCima: 0..max; fclase; Algoritmos y Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva 10 TAD Pila Tema 2 ! Consideraciones: ! si la pila es no vacía, el elemento almacenado en elementos[indCima] corresponde a la cima de la pila ! elementos[1] ≡ fondo de la pila ! indCima = 0 ≡ pila vacía ! Ventaja: todas las operaciones tienen un coste temporal constante O(1) ! Inconvenientes: ! reservar espacio de memoria para el máximo previsto de elementos ! gestionar pila llena ! Opciones para controlar la parcialidad o situaciones de error 1. controlar el posible error dentro de la operación 2. proporcionar suficientes operaciones para que el propio usuario evite el error 3. devolver valores que indiquen cuál ha sido el resultado de la operación Algoritmos y Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva 11 TAD Pila Tema 2 Mediante una lista enlazada c e1 e2 ... en tipo pila = clase público constructor creaPila; acción apilar (e: Elemento); acción desapilar; función cima: Elemento; función esVacía: booleano privado c: PtrNodo; fclase; ftipo; Ventajas: ! todas las operaciones tienen un coste temporal constante O(1) ! no hay limitaciones de tamaño Algoritmos y Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva 12 TAD Pila Tema 2 c ... e1 e2 en tipo pila = clase público constructor creaPila; acción apilar (e: PtrElemento); acción desapilar; función cima: PtrElemento; función esVacía: booleano privado c: PtrNodo; fclase; ftipo; Ventajas: ! todas las operaciones tienen un coste temporal constante O(1) ! no hay limitaciones de tamaño Algoritmos y Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva 13 TAD Pila Tema 2 ! Se define una clase Nodo, que representa a cada uno de los objetos que forman la lista enlazada tipo PtrNodo = puntero a Nodo; nodo = clase público constructor creaNodo(e: Elemento; psig: PtrNodo); acción setElemento(e: Elemento); acción setSig(psig: PtrNodo); función getElemento: Elemento; función getSig: PtrNodo; privado elem: Elemento; sig: PtrNodo; fclase; ftipo; Algoritmos y Estructuras de Datos II tipo PtrElemento = puntero a Elemento; PtrNodo = puntero a Nodo; nodo = clase público constructor creaNodo(pe: PtrElemento; psig: PtrNodo); acción setElemento(pe: PtrElemento); acción setSig(psig: PtrNodo); función getElemento: PtrElemento; función getSig: PtrNodo; privado elem: PtrElemento; sig: PtrNodo; fclase; ftipo; I.T. en Informática de Gestión/Sistemas Universidad de Huelva 14 Tema 2 TAD Lineales: Pila, Cola y Lista 2.2.4 Consideraciones sobre TAD basados en punteros ! Si se realiza una asignación entre dos variables de tipo puntero (ej., p := q), no se realiza una copia del valor del tipo (p.e. una pila completa), sino que se duplica la forma de acceder a ella p 4 6 8 q 1 3 5 4 6 8 1 3 5 p q Algoritmos y Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva 15 Universidad de Huelva 16 TAD Pila Tema 2 ! Método de la clase pila para realizar una copia acción pila.copia (p: pila); var pv, n, antn: PtrNodo; fvar; inicio self.creaVacía; pv = p.c; si pv ≠ nulo entonces reservar (n, creaNodo(pv^.getElem, nulo); c := n; antn := n; pv := pv^.getSig; mientras pv ≠ nulo hacer reservar (n, creaNodo(pv^.getElem, nulo); antn^.setSig(n); antn := n; pv := pv^.getSig; fmientras; fsi facción; Algoritmos y Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Tema 2 TAD Lineales: Pila, Cola y Lista ! Cuando dejamos de necesitar una estructura dinámica, debemos ocuparnos de liberar la memoria ! Método destructor para la clase pila: destructor pila.liberar; inicio mientras self.esVacía hacer self.desapilar; fmientras; facción; Algoritmos y Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva 17 TAD Cola Tema 2 2.3 El TAD Cola 2.3.1 Conceptos ! Los elementos se añaden por el extremo final, y se eliminan por el extremo opuesto: frente ! El único elemento observable en todo momento es el primero que fue insertado ! Se le suele denominar estructura FIFO (First Input First Output). Aplicaciones $ Colas de trabajos a realizar por una impresora $ Asignación de tiempo de procesador a los procesos en un sistema multiusuario (sin prioridad) $ Simular situaciones reales: cajero automático, llamadas en espera, ... Algoritmos y Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva 18 TAD Cola Tema 2 2.3.2 Especificación algebraica espec colas usa booleanos parámetro formal género elemento fpf género cola operaciones creaCola: # cola añadir: cola elemento # cola parcial eliminar: cola # cola parcial primero: cola # elemento vacía?: cola # booleano dominios de definición c: cola; e: elemento eliminar (añadir (c,e)) primero (añadir (c,e)) Algoritmos y Estructuras de Datos II ... I.T. en Informática de Gestión/Sistemas Universidad de Huelva 19 TAD Cola Tema 2 ecuaciones c: cola; e: elemento eliminar (añadir (c,e)) = si vacia?(c) entonces creaCola sino añadir (eliminar(c), e) fsi primero (añadir (c,e)) = si vacia?(c) entonces e sino primero(c) fsi vacia? (creaCola) = verdad vacia? (añadir (c,e)) = falso fespec Algoritmos y Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva 20 TAD Cola Tema 2 ! Las operaciones son: Gen (cola) = {creaCola, añadir} Mod (cola) = {eliminar} Obs (cola) = {primero, vacia?} El conjunto de generadoras es libre, ya que cualquier término formado por las operaciones generadoras denota siempre un valor distinto del TAD Cola ! Los patrones necesarios para representar todas las posibles colas se obtienen del conjunto de las operaciones generadoras ! creaCola: representa la cola sin ningún elemento (cola vacía) añadir(c,e): representa cualquier cola con, al menos, un elemento Algoritmos y Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva 21 TAD Cola Tema 2 2.3.3 Implementación módulo TadCola importa TadElemento, TadNodo exporta tipo cola primero último e1 e2 Algoritmos y Estructuras de Datos II en · cola= clase público constructor creaCola; acción añadir (e: elemento); acción eliminar; función primero: elemento; función esVacía: booleano; acción copia (c: cola); destructor liberar; privado primero, ultimo: PtrNodo; fclase; I.T. en Informática de Gestión/Sistemas Universidad de Huelva 22 TAD Cola Tema 2 constructor cola.creaCola inicio primero:= nulo; ultimo:= nulo; fconstructor accion cola.eliminar (* Se elimina por el principio *) var aux: PtrNodo; fvar inicio si primero = ultimo entonces ultimo := nulo; fsi; aux:= primero; primero:= primero^.getSig; liberar(aux) faccion Algoritmos y Estructuras de Datos II acción cola.añadir (e:elemento) var nuevo: PtrNodo n: nodo ; fvar inicio si primero = nulo entonces reservar (primero, creaNodo(e, nulo)); ultimo:= primero sino reservar (nuevo, creaNodo(e, nulo)); ultimo^.setSig (nuevo); ultimo:= nuevo; fsi; faccion I.T. en Informática de Gestión/Sistemas Universidad de Huelva 23 TAD Lista Tema 2 2.4 El TAD Lista 2.4.1 Conceptos ! Generalización del TAD Pila y TAD cola ! Secuencia de elementos en la que se permite el acceso para consultar, añadir o eliminar elementos en cualquier posición ! Existen diversas formas de generar las listas. En nuestro caso elegimos un conjunto de operaciones pequeño y libre ! Nos apoyamos en la definición recursiva de secuencia de elementos: colección de elementos del mismo tipo que: % bien es vacío, en cuyo caso se denomina secuencia vacía % bien se obtiene tras añadir por la izquierda un elemento a otra secuencia existente ! Operaciones generadoras [] Gen (lista) = +izq (e, l) Algoritmos y Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva 24 TAD Lista Tema 2 2.4.2 Especificación algebraica ! PRIMERA PARTE: especificación del TAD Lista con las operaciones de añadir, eliminar y consultar elementos por los extremos espec listas1 usa booleanos, naturales parámetro formal género elemento operaciones _ == _: elemento elemento # booleano _ ≠ _: elemento elemento # booleano fpf género lista operaciones [ ]: # lista +izq: elemento lista # lista [ _ ] : elemento # lista _ & _ : lista lista # lista +dch: lista elemento # lista vacía?: lista # booleano Algoritmos y Estructuras de Datos II parcial -izq: lista # lista parcial -dch: lista # lista parcial izq: lista # elemento parcial dch: lista # elemento longitud: lista # natural está?: elemento lista # booleano I.T. en Informática de Gestión/Sistemas Universidad de Huelva ... 25 TAD Lista Tema 2 dominios de definición e: elemento; l: lista -izq (+izq (e, l)) -dch (+izq (e, l)) izq (+izq (e, l)) dch (+izq (e, l)) ecuaciones e, e1, e2: elemento; l, l1, l2: lista [e] = +izq (e, [ ]) []&l=l +izq (e, l1) & l2 = +izq (e, l1 & l2) +dch ([ ], e) = +izq (e, [ ]) +dch (+izq (e1, l), e2) = +izq (e1, +dch (l, e2)) estas dos ecuaciones son equivalentes a la ecuación +dch (l, e) = l & [e] ... Algoritmos y Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva 26 TAD Lista Tema 2 -izq (+izq (e, l)) = l -dch (+izq (e, l)) = si vacía? (l) entonces [ ] sino +izq (e, -dch (l)) fsi esta ecuación es equivalente a las ecuaciones -dch (+izq (e, [ ])) = [ ] -dch (+izq ( e1, +izq (e2, l))) = +izq (e1, -dch (+izq (e2, l))) izq (+izq (e, l)) = e si vacía? (l) entonces e sino dch (l) fsi esta ecuación es equivalente a las ecuaciones dch (+izq (e, [ ]) = e dch (+izq (e1, +izq (e2, l))) = dch (+izq (e2, l)) dch (+izq (e, l)) = ... Algoritmos y Estructuras de Datos II Tema 2 I.T. en Informática de Gestión/Sistemas Universidad de Huelva 27 Universidad de Huelva 28 TAD Lista long ([ ]) = 0 long (+izq (e, l)) = suc (long (l)) está? (e, [ ]) = falso está? (e1, +izq (e2, l)) = e1 == e2 ∨ está? (e1, l) vacía? ([ ]) = verdad vacía? (+izq (e, l)) = falso fespec Algoritmos y Estructuras de Datos II I.T. en Informática de Gestión/Sistemas TAD Lista Tema 2 ! SEGUNDA PARTE: especificación del TAD Lista enriquecido con las operaciones de inserción, consulta y modificación en cualquier posición espec listas usa listas1 operaciones parcial insertar: lista nat elemento # lista {insertar elemento i-ésimo} parcial eliminar: lista nat # lista {eliminar elemento i-ésimo} parcial modificar: lista nat elemento # lista {modificar elemento i-ésimo} parcial _ [ _ ] : lista nat # elemento {elemento i-ésimo} parcial pos: elemento lista # natural {posición del elemento} dominios de definición e: elemento; l: lista; i: natural insertar (l, i, e) está definido sólo si (1 ≤ i) ∧ (i ≤ long (l) + 1) eliminar (l, i) está definido sólo si (1 ≤ i) ∧ (i ≤ long (l)) modificar (l, i, e) está definido sólo si (1 ≤ i) ∧ (i ≤ long (l)) l[i] está definido sólo si (1 ≤ i) ∧ (i ≤ long (l)) pos (e, l) está definido sólo si está? (e, l) Algoritmos y Estructuras de Datos II ... I.T. en Informática de Gestión/Sistemas Universidad de Huelva 29 TAD Lista Tema 2 ecuaciones e, e1, e2: elemento; l: lista; i: natural { i solo puede valer 1. 1 ≤ i ≤ 1 } insertar ([ ], i, e) = +izq (e, [ ]) insertar (+izq (e1, l), i, e2)) = si i = 1 entonces +izq (e2, +izq (e1, l)) sino +izq (e1, insertar (l, i -1, e2)) fsi eliminar (+izq (e, l), i) = si i = 1 entonces l { 1 ≤ i ≤ long (+izq (e, l)) } sino +izq (e, eliminar (l, i -1)) fsi modificar (+izq (e1, l), i, e2) = si i = 1 entonces +izq (e2, l) { 1 ≤ i ≤ long (+izq (e, l)) } sino +izq (e1, modificar (l, i-1, e2)) fsi ... Algoritmos y Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva 30 TAD Lista Tema 2 +izq (e, l) [i] = si i = 1 entonces e sino l [i-1] fsi pos (e1, +izq (e2, l)) = si e1 == e2 entonces 1 sino 1 + pos (e1, l) fsi fespec Algoritmos y Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva 31 TAD Lista Tema 2 2.4.3 Implementación dinámica ! La implementación dinámica más sencilla se realiza mediante un puntero apuntando al nodo que contiene el primer elemento de la lista ! Cada nodo está formado por el elemento y un puntero que apunta al siguiente nodo. El último nodo de la lista apunta a nulo tipo lista = clase público { operaciones del TAD } privado cab: PtrNodo; fclase; ftipo; Algoritmos y Estructuras de Datos II cab e1 I.T. en Informática de Gestión/Sistemas e2 ... en Universidad de Huelva 32 TAD Lista Tema 2 ! En la siguiente tabla se observa el coste de las operaciones, para el peor caso, utilizando este tipo de representación operación coste operación coste crearLista O(1) longitud O(n) añadeIzq O(1) pertenece O(n) creaUnitaria O(1) inserta O(n) eliminaIzq O(1) elimina O(n) observaIzq O(1) modifica O(n) esVacía O(1) observa O(n) concatena O(n) posición O(n) añadeDch O(n) observaDch O(n) eliminaDch O(n) Algoritmos y Estructuras de Datos II n ≡ longitud de la lista I.T. en Informática de Gestión/Sistemas Universidad de Huelva 33 TAD Lista Tema 2 ! Ampliando la estructura del tipo, algunas operaciones pasan a ser de orden constante último primero tipo lista = clase público { operaciones del TAD } privado primero, último: PtrNodo; num: natural; fclase; ftipo; Algoritmos y Estructuras de Datos II e1 e2 ... en n num I.T. en Informática de Gestión/Sistemas operación coste concatena O(1) añadeDch O(1) observaDch O(1) longitud O(1) Universidad de Huelva 34 Tema 2 TAD Lista ! Listas con punto de interés % Se define un elemento distinguido dentro de la lista % Sirve de referencia para realizar las operaciones % Puede cambiarse de elemento con funciones del tipo (poner al principio, avanzar, poner al final, etc.) % Se añade un nuevo índice que mantiene el índice del elemento distinguido y un puntero que se sitúa en el nodo inmediatamente anterior al elemento distinguido % Ejemplo: línea de texto en un procesador de textos tipo lista = clase público { operaciones del TAD } privado primero, último, actual: PtrNodo; num, indActual: natural; fclase; ftipo; Algoritmos y Estructuras de Datos II Tema 2 Definición del TAD Lista Algoritmos y Estructuras de Datos II I.T. en Informática de Gestión/Sistemas operación coste insertar O(1) eliminar O(1) modificar O(1) observa O(1) posición O(1) Universidad de Huelva 35 TAD Lista tipo lista = clase público constructor crearLista; acción añadeIzq (e: elemento); acción concatena (l: lista); acción creaUnitaria (e: elemento); acción añadeDch (e: elemento); acción eliminaIzq; acción eliminaDch; función observaIzq: elemento; función observaDch: elemento; función longitud: entero; función pertenece (e: elemento): booleano; función esVacía: booleano; acción inserta (i: entero; e: elemento); acción elimina (i: entero); acción modifica (i: entero; e: elemento); función observa (i: entero): elemento; función posición (e: elemento): natural; acción copia (l: lista); acción libera; privado primero, último: PtrNodo; num: natural; fclase; ftipo; I.T. en Informática de Gestión/Sistemas Universidad de Huelva 36 TAD Lista Tema 2 Ejemplo de operaciones del TAD Lista Crear la lista vacía constructor crearLista; Añadir un elemento por la derecha acción añadeDch (e: elemento); primero:= nulo; var nuevo: ptrNodo fvar ultimo:= nulo; si esVacía entonces creaUnitaria (e) num:= 0; sino reservar (nuevo, creaNodo(e, nulo)); fconstructor último^.setSig(nuevo); último:= nuevo; num:= num + 1; fsi facción Algoritmos y Estructuras de Datos II Tema 2 I.T. en Informática de Gestión/Sistemas Universidad de Huelva 37 TAD Lista Eliminar el elemento de la derecha Ejemplo de operaciones del TAD Lista Algoritmos y Estructuras de Datos II acción eliminaDch; var aux: ptrNodo; fvar si esVacía entonces si num=1 entonces liberar (primero); l.crearLista; sino aux:= primero; mientras aux^.getSig ≠ ultimo hacer aux:= aux^.getSig; fmientras aux^.setSig(nulo); liberar (último); último:= aux; num:= num – 1; fsi fsi facción I.T. en Informática de Gestión/Sistemas Universidad de Huelva 38