Estructuras de Datos Dinámicas: Pilas y Filas Tipo de Dato Abstracto Programación I Departamento de Informática Universidad Nacional de San Luis Argentina Repaso de Estructuras de Datos (1) • Nociones Generales – Agrupación de valores que por razones lógicas, se quiere conservar ‘juntos’. – Cómo se incorpora un nuevo elemento a la estructura. – Cómo se elimina o cambia un elemento que ya está en la estructura. – Cómo se inspecciona un elemento que ya está en la estructura. Departamento de Unformática - UNSL Programación I - Estrucutras Dinámicas y TDA 2 Repaso de Estructuras de Datos (2) • • Estos tres últimos aspectos tienen que ver con las operaciones que pueden hacerse sobre la estructura de datos: Poner, Sacar, Inspeccionar. Orden, con respecto a las operaciones: Cronológico, No Cronológico. – Cómo se guardan los elementos en la estructura, es decir en qué orden se encuentran unos con respecto a los otros. Deben tener algún orden o estructura. Departamento de Unformática - UNSL Programación I - Estrucutras Dinámicas y TDA 3 Repaso de Estructuras de Datos (3) • • • Cuántos elementos se pueden guardar, capacidad de almacenamiento de la estructura: Estática / Dinámica. Identificar o seleccionar los elementos de la estructura: sin ambigüedad. Selector de la estructura, Unívoco. Explícito / Implícito. Tipo de los datos de los elementos de la estructura. A este tipo de dato le llamaremos tipo de dato base de la estructura. Simples / Compuestos. Homogéneo / Heterogéneo. Departamento de Unformática - UNSL Programación I - Estrucutras Dinámicas y TDA 4 Estructuras de Datos Dinámicas: Pila (stack) (1) • Capacidad: Dinámica, crece y disminuye con las inserciones y supresiones Por eso se habla de que la estructura puede estar vacía • Orden: LIFO Departamento de Unformática - UNSL Last In First Out. Programación I - Estrucutras Dinámicas y TDA 5 Estructuras de Datos Dinámicas: Pila (stack) (2) • Operaciones. – – – – – Inicialización (init) Inserción (insert o push) Supresión (suppress o pop) Copia (copy o top o peek) Predicados: isEmpty, isFull. tope • Selector: implícito tope Departamento de Unformática - UNSL Programación I - Estrucutras Dinámicas y TDA 6 Estructuras de Datos Dinámicas: Pila (stack) (3) suprimir (pop) insertar (push) Z insertar (push) R insertar (push) Q Z R Q tope isEmpty isEmpty == false true (verdadero) (falso) Departamento de Unformática - UNSL Programación I - Estrucutras Dinámicas y TDA 7 Estructuras de Datos Dinámicas: Fila o cola (queue) (1) • Capacidad: Dinámica, crece y disminuye con las inserciones y supresiones Por eso se habla de que la estructura puede estar vacía. • Orden: FIFO Departamento de Unformática - UNSL First In First Out. Programación I - Estrucutras Dinámicas y TDA 8 Estructuras de Datos Dinámicas: Fila o cola (queue) (2) • Operaciones. – – – – – Inicialización (init) Inserción (insert) después del último Supresión (suppress) primero Copia (copy) Predicados: isEmpty, isFull. • Selector: implícito primero / último Departamento de Unformática - UNSL Programación I - Estrucutras Dinámicas y TDA 9 Estructuras de Datos Dinámicas: Fila o cola (queue) (2) suprimir insertar Z insertar R Insertar Q primero Q último Departamento de Unformática - UNSL R Z isEmpty = false isEmpty = true (falso) (verdadero) Programación I - Estrucutras Dinámicas y TDA 10 Tipo de Datos Abstracto (TDA) (1) • En inglés: Abstract Data Type (ADT). • TDA se define a partir de las operaciones que pueden ser realizadas sobre los datos del tipo. • Hay modelos matemáticos para los tipos de datos. Ej.: enteros y suma. • Ocultamiento de la información (information hiding). Departamento de Unformática - UNSL Programación I - Estrucutras Dinámicas y TDA 11 Tipo de Datos Abstracto (TDA) (2) Ejemplo: Stack (Pila) podría ser definido por solo tres operaciones (funciones) sobre las pilas: init, push, pop, y un predicado: isEmpty. Operaciones (funciones) : init: Stack push: Elem Stack Stack pop: Stack Stack Elem isEmpty: Stack boolean Departamento de Unformática - UNSL Programación I - Estrucutras Dinámicas y TDA 12 Tipo de Datos Abstracto (TDA) (3) init: Stack push: Elem Stack Stack pop: Stack Stack Elem isEmpty: Stack boolean pop(init()) = ERROR pop(push(e, s)) = (s, e) isEmpty(init()) = true isEmpty(push(e, s)) = false Departamento de Unformática - UNSL Programación I - Estrucutras Dinámicas y TDA 13 Tipo de Datos Abstracto (TDA) (4) • Lenguaje de programación: se implementa un nuevo tipo no provisto por el lenguaje, sobre la base de los tipos y operaciones existentes. • TDA en C para prácticas de pilas, filas, listas cuyo tipo base puede ser enteros (int) y carácter (char). • Declaraciones de variables y operaciones. – Ej.: pila_char pila; • Apunte TDA. Departamento de Unformática - UNSL Programación I - Estrucutras Dinámicas y TDA 14 Tipo de Datos Abstracto (TDA) (5) Ejemplo de uso (1) /* ****** Print fila int ****** */ void printFilaInt (fila_int x) { while (!isEmpty(x)) { printf("%d ", copy(x)); suppress(&x); } printf("\n"); } /* fin de printFilaInt */ Departamento de Unformática - UNSL Programación I - Estrucutras Dinámicas y TDA 15 Tipo de Datos Abstracto (TDA) (6) Ejemplo de uso (2) /* ****** Buscar en fila int ****** */ void buscaFilaInt (fila_int x, int y) { while (!isEmpty(x) && copy(x) != y) { suppress(&x); } if (!isEmpty(x)) printf(“%d esta en la fila\n”, y); else printf(“%d NO esta en la fila\n“, y); } /* fin de buscaFilaInt */ Departamento de Unformática - UNSL Programación I - Estrucutras Dinámicas y TDA 16 Tipo de Datos Abstracto (TDA) (7) Ejemplo de uso (3) /* ****** Copiar fila int ****** */ void copiaFilaInt (fila_int *x, fila_int y){ while (!isEmpty(y)) { insert(x, copy(y)); suppress(&y); } } /* fin de copiaFilaInt */ Departamento de Unformática - UNSL Programación I - Estrucutras Dinámicas y TDA 17 Estructuras de Datos Dinámicas: Listas (1) • Capacidad: dinámica, crece y disminuye con las inserciones y supresiones • Orden: No tiene orden cronológico de inserción o supresión. Secuencia. • – unidireccional, 1º último Departamento de Unformática - UNSL Programación I - Estrucutras Dinámicas 18 Estructuras de Datos Dinámicas: Listas (2) • Elementos de una lista unidireccional o secuencia, llamados nodos, constan de dos partes: • • • Variable de Información Propiamente Dicha (VIPD) puntero al elemento (nodo) siguiente en la lista. último elemento, el puntero no apunta a un elemento y se dice que su valor es nil Departamento de Unformática - UNSL Programación I - Estrucutras Dinámicas 19 Estructuras de Datos Dinámicas: Listas (3) Operaciones – – – – Inserción Supresión Copia Predicados: isEmpty, isFull. Departamento de Unformática - UNSL Programación I - Estrucutras Dinámicas 20 Estructuras de Datos Dinámicas: Listas (4) • Selector de la lista: implícito cursor • Operaciones sobre el cursor de la lista – Ir al primero: reset – Avanzar: forwards – Predicado: Fuera de la estructura (cursor = nil): isOos Departamento de Unformática - UNSL Programación I - Estrucutras Dinámicas 21 Estructuras de Datos Dinámicas: Listas: Representación gráfica (4) Acceso a la lista Puntero al siguiente vipd ••• A nil ••• Elemento i Cursor Departamento de Unformática - UNSL Programación I - Estrucutras Dinámicas 22 Cursor insert con lista vacía – isEmpty = true isOos = true Z – isEmpty = false isOos = false Departamento de Unformática - UNSL Programación I - Estrucutras Dinámicas 23 Cursor insert con lista NO vacía – isEmpty = false isOos = false ••• G ••• i i+1 i ••• P G ••• – isEmpty = false isOos = false Departamento de Unformática - UNSL Programación I - Estrucutras Dinámicas 24 Cursor insert con lista NO vacía – isEmpty = false isOos = true ••• 7 ••• ••• 7 ••• 4 – isEmpty = false isOos = false Departamento de Unformática - UNSL Programación I - Estrucutras Dinámicas 25 Cursor suppress con lista NO vacía – isEmpty = false isOos = false ••• Y T ••• i i+1 ••• T ••• i – isEmpty = false isOos = false Departamento de Unformática - UNSL Programación I - Estrucutras Dinámicas 26 Cursor suppress con lista NO vacía – isEmpty = false isOos = false ••• S D n n-1 ••• – isEmpty = false isOos = true Departamento de Unformática - UNSL S n-1 Programación I - Estrucutras Dinámicas 27 Cursor suppress con lista NO vacía – isEmpty = false isOos = false R – isEmpty = true isOos = true Departamento de Unformática - UNSL Programación I - Estrucutras Dinámicas 28 Tipo de Datos Abstracto (TDA) (1) Ejemplo de uso (1) #include “list_of_int.h” ... /**** Imprime lista de enteros ****/ void printListaInt (list_of_int x) { reset(&x); while (!isOos(x)) { printf("%d ", copy(x)); forwards(&x); } printf("\n"); } /* fin de printListaInt */ Departamento de Unformática - UNSL Programación I - Estrucutras Dinámicas y TDA 29 Tipo de Datos Abstracto (TDA) (2) Ejemplo de uso (2) #include “list_of_char.h” ... /* ***** Buscar en lista de char ***** */ void buscaListaChar(list_of_char x, char y) { reset(&x); while (!isOos(x) && copy(x) != y) { forwards(&x); } if (!isOos(x)) printf(“%c esta en la lista\n”, y); else printf(“%c NO esta en la lista\n“, y); } /* fin de buscaListaChar */ Departamento de Unformática - UNSL Programación I - Estrucutras Dinámicas y TDA 30 Tipo de Datos Abstracto (TDA) (3) Ejemplo de uso (3) #include “list_of_int.h” ... /* ****** Copiar lista de int ****** */ void copiaListaInt (lista_of_int *x, lista_of_int y) { reset(&y); while (!isOos(y)) { insert(x, copy(y)); forwards(&y); } } /* fin de copiaListaInt */ Departamento de Unformática - UNSL Programación I - Estrucutras Dinámicas y TDA 31