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;