2. Listas
La lista 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.
Lista almacena valores en un determinado orden.
En una lista, 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. Características de la listas
1. Representa el dato a almacenar. Puede ser de cualquier
tipo; en este ejemplo se trata de una lista de enteros.
2. Es un puntero al siguiente elemento de la lista; con
este puntero enlazamos con el sucesor, de forma que
podamos construir la lista.
Para que esta estructura sea un TDA lista enlazada,
debe tener unos operadores asociados que permitan la
manipulación de los datos que contiene. 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
4. Definición
Son aquellas que solo tiene 2 operaciones,
Push(Inserción) y Pop(Eliminación) la cual solo se
puede efectuar por un extremo llamado Top. Sin
Embargo se le pueden aplicar todas las operaciones al
igual que a las listas.
Pila almacena valores solo que el ultimo valor
añadido va a ser el primero de la lista
Utilidad
Bueno, las utilidades de esta estructura son bastantes,
entre ellas esta la construcción de calculadoras,
simulación de recursión o recorrido de arboles por
niveles entre muchas otras cosas mas. La forma de
programarlas varían según el lenguajes.
5. Definición:
Ya que las pilas son LIFO(Last in - First Out) el
Recorrido se hace sacando el ultimo dato que se inserto
hasta que no encuentre ningún otro.
Detalle:
Apuntador toma el Top, después ve si la condición
cumple para efectuar un Ciclo mientras Apuntador sea
diferente de Nulo, si cumple lo que hace es que despliega
el contenido de la Pila(Pila[Apuntador]), después
Apuntador se le resta 1. Este proceso se repite hasta que
Apuntador sea igual Nulo(Cuando llega a este punto la
Pila ya fue Recorrida).
6. Imaginemos que queremos untar deliciosa y cremosa cajeta en
estos panes, lo mas normal es que tomemos el pan que esta hasta
arriba y untemos en él la cajeta, después tomamos el que sigue, el
que sigue, y así hasta llegar al final. Seria mas incomodo sacar
panes del medio para untarlos todos, o de la parte de abajo.
Otro ejemplo es una torre de discos, para sacar el disco de hasta
abajo, tienes que sacar primero todos los que están arriba de el, y
es mas lata cuando no sabes que disco es, tienes que buscar de uno
por uno e irlos sacando.
7. Recorrido(Pila, Top)
Apuntador ←- Top
Repetir mientras Apuntador ≠ Nulo
Imprimir Pila[Apuntador]
Apuntador ←- Apuntador - 1
Fin del ciclo
Salir
8.
9.
10. Definición:
Push es simplemente el método por el cual va agregando un
Dato nuevo a la Pila tomando en cuenta la Capacidad Máxima
(Max) de almacenar un dato.
Detalle:
Compara en un principio el Top con Max, si la condición no
cumple es imposible insertar mas datos a la Pila, de otra
forma lo que hace es Incrementar el valor de Top, y copia el
valor de Elemento en Pila[Top]. De esta forma el dato ya
esta insertado.
Algoritmo:
Push(Pila, Top, Max, Elemento)
Si Top ≠ Max
Top ←- Top + 1
Pila[Top] ←- Elemento
Si no:
Imprimir “Pila Llena”
Salir
11. Definición:
Pop es simplemente el método por el cual va sacando el
ultimo Dato de la Pila, basándose únicamente en el Top.
Detalle:
Compara para determinar si la pila esta vacío, de otra
forma lo que hace es Imprimir el valor de Pila[Top]
(Que es el dato que esta apunto de Eliminar) y enseguida
a Top le resta 1, de esta forma el dato ya no existe.
Algoritmo:
Pop(Pila, Top)
Si Top ≠ Nulo
Imprimir Pila[Top]
Top ←- Top - 1
Si no:
Imprimir “Pila Vacía”
Salir
12. Las Pilas en programación
Suponiendo que tenemos un arreglo en cualquier lenguaje. Dependiendo del
lenguaje podremos sacar valores de dicho arreglo en desorden si así lo deseamos
de diferentes formas, la idea es crear un arreglo con ciertas restricciones, en
donde solo se puedan retirar elementos de un solo lado y solo se pueda retirar el
elemento que esta hasta la orilla de dicho arreglo. Para retirar elementos es muy
común utilizar el método pop, y para introducirlos, el método push. Así,
deberemos bloquear todas las modificaciones que podamos hacerle al arreglo y
manipular estos movimientos con métodos creados por nosotros que solo
permitan sacar el elemento que se encuentra en el tope e introducir nuevos
elementos encima del tope.
13. Una cola es una estructura de datos, caracterizada por
ser una secuencia de elementos en la que la operación
de inserción push se realiza por un extremo y la
operación de extracción pop por el otro. También se le
llama estructura FIFO (del inglés First In First Out),
debido a que el primer elemento en entrar será también
el primero en salir.
El tipo cola representa la idea que tenemos de cola en
la vida real. La cola para subir al autobús está
compuesta de elementos (personas), que dispone de dos
extremos comienzo y fin. Por el comienzo se extraerá
un elemento cuando haya comprado el billete para su
viaje, y si llega una nueva persona con intención de
usar el autobús, tendrá que colocarse al final y esperar
que todos los elementos situados antes que él
abandonen la cola.
15. Colas de prioridad: En ellas, los elementos se
atienden en el orden indicado por una prioridad
asociada a cada uno. Si varios elementos tienen la
misma prioridad, se atenderán de modo convencional
según la posición que ocupen.
Hay 2 formas de implementación: además los datos
no son datos sino son resultados que se
representaran a través del tiempo. puede ser alguien
o algo.
1. Añadir un campo a cada nodo con su prioridad.
2. Resulta conveniente mantener la cola ordenada por
orden de prioridad.
3. Crear tantas colas como prioridades haya, y
almacenar cada elemento en su cola.
16. Bicolas: son colas en donde los nodos se pueden
añadir y quitar por ambos extremos; se les llama
DEQUE (Double Ended QUEue). Para representar
las bicolas lo podemos hacer con un array circular
con Ini y Fin que apunten a cada uno de los
extremos.
Hay variantes o Bicolas de entrada restringida:
Son aquellas donde la inserción sólo se hace por el
final, aunque podemos eliminar al principio ó al final.
o Bicolas de salida restringida: Son aquellas donde
sólo se elimina por el final, aunque se puede insertar
al principio y al final.
17. La pila y la cola son 2 casos especiales de uso de una lista. Todos son TAD: Tipos Abstractos de Datos.
En una lista los datos pueden almacenarse (insertarse) en cualquier orden, y eliminarse desde cualquier lugar. Es
decir puedes insertar al comienzo, al final, en el medio... y de la misma manera se puede eliminar.
Una Cola es una lista FIFO: First In, First Out. "Primero en Entrar, Primero en Salir", en castellano. Es decir los
elementos se ordenan desde un extremo (el frente) y se van ordenando uno detrás del otro. El elemento que está
en primer lugar entonces se eliminará, y ahora el segundo pasará a ser el primero. La representación más visual y
que aclara esto lo puedes ver cada vez que haces cola o fila para ser atendida en caja. Naturalmente, el último en
llegar, será el último en salir.
En cambio, la Pila es una lista LIFO: Last In, First Out. "Primero en Entrar, Último en Salir". Es decir los elementos
se van formando de forma inversa, llega el primero, a continuación el segundo se ubica delante de él, y así hasta
llegar el último. Ahora en el tope de la pila estará el último. Por tanto a eliminarse, se van retirando en forma
inversa, desde el último hacia el primero. Un ejemplo típico: cuando apilas los platos al lavar y secar.
En términos técnicos, los elementos tienen un puntero (dirección de memoria) que permite "apuntar" al elemento
próximo en la lista.