1. Listas, Pilas y Colas
Estructura de Datos
Dr. Rina Familia
Yorka M. Perez F. 11-1157
2. Lista
Es una de las estructuras de datos fundamentales, y
puede ser usada para implementar otras estructuras
de datos. Consiste en una secuencia de nodos, en los
que se guardan campos de datos arbitrarios y una o
dos referencias, enlaces o punteros al nodo anterior o
posterior.
3. TDA Lista Lineal
Una misma definición de un TDA puede conllevar a
implementaciones diferentes en dependencia de las
necesidades, así como de las características del lenguaje
en el que se va a desarrollar dicha implementación.
Por su forma de almacenamiento, la lista lineal se puede
implementar en una de las siguientes disposiciones:
• Secuencial
• Enlazada
4. Lista Secuencial
Una de las formas más simples de implementación de este TDA
es usando un arreglo unidimensional.
Todos los elementos de la lista se almacenan en posiciones de
memoria consecutivas. Por se habla de disposición secuencial en
la memoria de la computadora.
A la lista se le conoce como lista secuencial.
6. Ventajas y desventajas
Ventajas
Con esta disposición se accede a cualquier elemento de la
estructura de datos en tiempo constante.
Desventajas
Al asignar el arreglo en tiempo de compilación debe
establecerse un límite a priori sobre el número de elementos
que pueden ser almacenados en las listas.
Para inserciones y eliminaciones frecuentes hay que hacer
corrimientos costosos.
7. Lista enlazada
En una lista enlazada se asigna memoria para el almacenar los
elementos de la lista conforme se va necesitando, es decir a
medida que se añaden o insertan los elementos, y se conectan los
elementos de la lista con punteros.
La memoria es liberada cuando ya no se necesita más un elemento
en la lista.
Esquemáticamente una lista enlazada se representa por una
secuencia de nodos conectados por enlaces.
8. Lista enlazada
primero
Cada nodo está conectado al siguiente por un solo enlace, a
esta estructura de datos se llama lista simplemente enlazada.
9. Lista enlazada
Un nodo de una lista simplemente enlazada contiene dos campos:
datos (contiene un elemento de la lista) y siguiente (almacena un
enlace al siguiente nodo de la lista).
El campo siguiente del último nodo contiene un símbolo especial
que indica el final de las lista.
Se accede a la lista por medio de un apuntador al primer elemento
y solo se puede recorrer la lista en un sentido, del primer nodo al
último nodo.
10. Lista doblemente enlazada
primero
…
Cada nodo contiene tres campos: un campo que almacena el elemento de la
lista y los otros dos almacenan los enlaces a los nodos precedente y siguiente
de la lista.
Se usan punteros nulos para marcar ambos extremos de la lista.
12. Lista doblemente enlazada circular
primero
…
El campo siguiente del último nodo apunte al primer nodo de la lista y el
campo anterior del primer nodo apunte al último nodo de la lista.
13. Ventajas y desventajas
Ventajas
No es preciso conocer la cantidad de elementos en tiempo
de compilación. Ni las inserciones ni las eliminaciones
implican realizar corrimientos de los elementos de la lista.
Desventajas
No permite el acceso directo a un elemento arbitrario de la
lista. Para acceder al i-ésimo elemento, debemos recorrer
la lista, comenzando por el primer nodo, hasta llegar al
elemento deseado.
17. Usando una pila (stack) para imprimir una lista en
orden inverso.
18. TDA PILA
Pila:
Es una lista ordenada de elementos en la que todas las
inserciones y supresiones se realizan por un mismo extremo
denominado tope o cima de la pila.
Estructura LIFO (Last In First Out): “último en entrar es el
primero en salir”
19. TDA PILA
La implementación de una pila se puede realizar mediante arreglos
o con punteros. El inconveniente de la realización de una pila
mediante arreglos es que su tamaño máximo se debe Especificar
en tiempo de compilación. Debido a esto, la implementación de
pilas se realiza Frecuentemente mediante punteros.
Una pila puede contener un número ilimitado de elementos y no
producir nunca desbordamiento. En la práctica, sin embargo, el
espacio de almacenamiento disponible es finito.
20. Las operaciones que se pueden realizar con una pila son:
PUSH (pila, elemento): Introduce un elemento en la pila.
También se le
conoce como poner o meter.
POP (pila): Elimina un elemento de la pila. También se le conoce como
sacar o quitar.
VACIA (pila): Función booleana que indica si la pila esta vacía o no.
22. Mecanismos de Implementación del Tad
Pilas a Través de Listas y Vectores
La pila también se puede implementar usando un array. Esto es mucho más
complicado que usar una lista pero en otros lenguajes puede ser útil si se conoce
el tamaño máximo que tendrá la pila.
Para implementar la pila con un arreglo hay que tener lo siguiente:
Una variable que guarde el tope
El largo del array
El array que contiene los datos
Para esto suponemos que el array comienza en 0.
Al principio la variable que indica el tope debe iniciarse en 0.
23. .
Colas
Una cola es un conjunto ordenado de elementos homogéneos, en el cual los
elementos se eliminan por uno de sus extremos, denominado cabeza, y se
añaden por el otro extremo, denominado final.
En las colas el elemento que entró primero también sale primero, por ello se
conocen como estructuras FIFO (First in First out). Así pues la diferencia con
las pilas es solamente el modo de entrada y salida de datos.
25. Colas
Una cola se diferencia de una pila en que las operaciones de inserción y
extracción siguen el principio de primero en entrar - primero en salir (firstin-first-out, FIFO).
Los elementos se pueden insertar en cualquier momento, pero solo el
elemento que ha permanecido el mayor tiempo puede ser extraído.
Los elementos se insertan (enqueued) al final (rear) y se extraen
(dequeued) desde el frente (front).
25
26. El tipo de Dato Abstracto Cola
La cola tiene dos métodos fundamentales:
enqueue(o): Inserta objecto o al final de la cola
dequeue(): Extrae el objeto del frente de la cola y lo devuelve;
ocurre un error si la cola está vacía
Los siguientes métodos de soporte deben ser definidos:
size(): Devuelve el núemro de objetos en la cola
isEmpty(): Devuelve un valor lógico que indica si la cola está
vacía
front():Devuelve, sin eliminar, el objeto del frente de la cola;
ocurre un error si la cola está vacía
26
27. Cola basada en Array
Crea una cola usando un array de forma circular.
Se especifica un tamaño máximo N, e.g. N = 1,000.
La cola consiste de un array Q de N-elementos y dos variables
enteras:
o -f, índice del elemento del frente
o -r, índice del elemento siguiente al final de la cola
“configuración normal”
27
28. Implementación de una Cola con una
Lista Enlazada Simple
Lista Enlazada Simple: Nodos conectados en cadena por enlaces
La cabeza de la lista es el frente de la cola, la cola de la lista es el final de la cola. Porqué no lo
contrario?
28
31. Colas con finales dobles
Una cola con doble-final, o deque, soporta inserción y extracción desde el
frente y el final.
El Tipo de Dato Abstracto Deque
insertFirst(e):
Inserta e al de-inicio de la deque.
insertLast(e): Inserta e al de-final de la deque
removeFirst():
Extrae y devuelve primer elemento
removeLast():
Extrae y devuelve último elemento
Métodos de soporte adicionales:
first()
last()
size()
isEmpty()
31