Este documento describe diferentes estructuras de datos como listas enlazadas, pilas y colas. Las listas enlazadas almacenan datos de forma dinámica mediante nodos que apuntan al siguiente. Las pilas siguen el principio LIFO mediante operaciones push y pop. Las colas siguen el principio FIFO mediante inserción y extracción en lados opuestos. Finalmente, se implementan pilas usando arrays o listas enlazadas.
Relaciones y Grafos
Producto cartesiano
Relación binaria
Representaciones de Relaciones
Diagrama de flechas
Propiedades de las relaciones (reflexiva, irreflexiva, simétrica, asimétrica, anti simétrica, transitiva)
Relaciones de equivalencia (cerraduras, clases de equivalencia, particiones)
Funciones (inyectiva, suprayectiva, biyectiva)
Este material didáctico fue desarrollado para la asignatura de Tópicos Avanzados de Programación, del plan SCD-1027 2016 de Ing. En Sistemas Computacionales
Relaciones y Grafos
Producto cartesiano
Relación binaria
Representaciones de Relaciones
Diagrama de flechas
Propiedades de las relaciones (reflexiva, irreflexiva, simétrica, asimétrica, anti simétrica, transitiva)
Relaciones de equivalencia (cerraduras, clases de equivalencia, particiones)
Funciones (inyectiva, suprayectiva, biyectiva)
Este material didáctico fue desarrollado para la asignatura de Tópicos Avanzados de Programación, del plan SCD-1027 2016 de Ing. En Sistemas Computacionales
1. Tad Lista, Pilas
y Colas
Bayron Ruben De Leon Perez
12-0542
Estructura de Datos
Prof. Rina Familia
2. Introducción
La lista enlazada es un TDA que nos permite
almacenar datos de una forma organizada, al igual
que los vectores pero, a diferencia de estos, esta
estructura es dinámica, por lo que no tenemos que
saber "a priori" los elementos que puede contener.
En una lista enlazada, cada elemento apunta al
siguiente excepto el último que no tiene sucesor y el
valor del enlace es null. Por ello los elementos son
registros que contienen el dato a almacenar y un
enlace al siguiente elemento. Los elementos de una
lista, suelen recibir también el nombre de nodos de
la lista.
3. Ejemplo
Figura 1. Esquema de un nodo y una lista enlazada.
epresenta el dato a almacenar.
Puede ser de cualquier tipo; en
este ejemplo se trata de una lista
de enteros.
Es un puntero al siguiente
elemento de la lista; con este
puntero enlazamos con el
sucesor, de forma que podamos
construir la lista.
4. Los operadores básicos de una lista
enlazada son:
Insertar: inserta un nodo con dato x en la lista, pudiendo
realizarse esta inserción al principio o final de la lista o
bien en orden.
Eliminar: elimina un nodo de la lista, puede ser según la
posición o por el dato.
Buscar: busca un elemento en la lista.
Localizar: obtiene la posición del nodo en la lista.
Vaciar: borra todos los elementos de la lista
5. GSList
La definición de la estructura GSList o, lo
que es lo mismo, un nodo de la lista, está
definido de la siguiente manera:
struct GSList { gpointer data; GSList *next; };
6. Pilas
Las pilas son estructuras de datos que tienes
dos operaciones básicas:
push (para insertar un elemento) y pop (para
extraer un elemento). Su
característica fundamental es que al extraer se
obtiene siempre el último
elemento que acaba de insertarse. Por esta
razón también se conocen como
estructuras de datos LIFO (del inglés Last In First
Out.
8. Una posible implementación mediante listas
enlazadas sería insertando y extrayendo
siempre por el principio de la lista. Gracias a
las pilas es posible el uso de la recursividad.
La variable que llama al mismo
procedimiento en el que está, habrá que
guardarla así como el resto de variables de
la nueva llamada, para a la vuelta de la
recursividad ir sacandolas, esto es posible a
la implementación de pilas.
9. Las pilas se utilizan en muchas aplicaciones
que utilizamos con frecuencia. Por ejemplo,
la gestión de ventanas en Windows
(cuando cerramos una ventana siempre
recuperamos la que teníamos detrás). Otro
ejemplo es la evaluación general de
cualquier expresión matemática para evitar
tener que calcular el número de variables
temporales que hacen falta.
10. Colas
Las colas también son llamadas FIFO (First In
First Out), que quiere decir “el primero que
entra es el primero que sale”.
11. Colas simples:
Se inserta por un sitio y se saca por otro, en
el caso de la cola simple se inserta por el
final y se saca por el principio. Para
gestionar este tipo de cola hay que
recordar siempre cual es el siguiente
elemento que se va a leer y cual
es el último elemento que se ha introducido.
13. Colas circulares:
En las colas circulares se considera que
después del último elemento se accede de
nuevo al primero. De esta forma se reutilizan
las posiciones extraídas, el final de la cola es
a su vez el principio, creándose un circuito
cerrado.
15. Colas con prioridad
Las colas con prioridad se implementan
mediante listas o arrays ordenados. No nos
interesa en este caso que salgan en el
orden de entrada sino con una prioridad
que le asignemos. Puede darse el caso que
existan
varios elementos con la misma prioridad, en
este caso saldrá primero aquel
que primero llego (FIFO).
16. Paquete Pila
Finalmente implementamos el paquete pila
tanto para un array como para listas. Esta
implementación será realmente útil para el
tema siguiente,recursividad.
17. Array:
ADS
generic type TDato is private;
package Pila_generica is
type TPila (Maximo : Positive) is private;
Llena, Vacia, FueraDeRango : exception;
procedure Push ( Pila : in out TPila; Dato : in TDato );
procedure Pop ( Pila : in out TPila; Dato: out TDato );
function PilaVacia (Pila : in TPila) return Boolean;
function PilaLlena (Pila : in TPila) return Boolean;
function Valor ( Pila : in TPila; Index : Positive ) return TDato;
private
type TVector is array (Positive range <>) of TDato;
type TPila (Maximo : Positive) is record
Contenido : TVector (1 .. Maximo);
Cima : Natural := 0;
end record;
end;