Esta presentación es parte del contenido del curso de Estructuras de Datos I impartido en la Universidad Rafael Landívar durante el año 2017.
Incluye los temas:
•Listas
•Listas Enlazadas
•Listas Circulares
•Listas Doblemente Enlazadas
•Pilas
•Colas
Creado por Ing. Alvaro Enrique Ruano
2. Estructuras de datos lineales
•Listas
•Listas Enlazadas
•Listas Circulares
•Listas Doblemente Enlazadas
•Pilas
•Colas
3. Listas
• Una lista lineal es un conjunto de elementos de
un tipo dado que pueden variar en cantidad.
• Cada elemento tiene un único predecesor y un
único sucesor (excepto el primero y el último).
• En la implementación, los elementos de una lista
se almacenan contiguos.
4. Listas
• La implementación se realiza por medio de arrays
(deben dimensionarse con un tamaño suficiente).
• El acceso a cualquier elemento de la lista y la
adición de nuevos elementos es fácil.
• El borrado o inserción de un elemento requiere un
desplazamiento de los demás elementos, para lo
cual se deben implementar algoritmos
específicos.
5. Listas
• Las operaciones que se implementan comúnmente son las siguientes:
• Localizar un elemento
• Insertar un elemento
• Eliminar un elemento
• Ordenar los elementos
• Copiar la lista
• Unir varias listas
• Dividir en sublistas
6. Listas Enlazadas
• Los elementos se almacenan en posiciones de
memoria que no son contiguas.
• Son un conjunto de elementos en los que cada
elemento contiene la posición (dirección de
memoria) del siguiente elemento de la lista.
• Eliminan los inconvenientes de las listas
tradicionales.
7. Listas Enlazadas
• Las listas enlazadas deben contar con por lo
menos tres elementos:
• Estructura especial para almacenar el
contenido de los elementos.
• Un apuntador al primer elemento de la lista
llamado cabecera.
• Un medio para detectar el último elemento de la
lista.
8. Listas Enlazadas
• Cada elemento de una lista enlazada tiene por
lo menos dos campos: el valor y el enlace (link)
9. Listas Enlazadas
• El último nodo, que no cuenta con un enlace a
otro elemento, se puede representar de las
siguientes maneras:
11. Listas Enlazadas
• La implementación de una lista enlazada dependerá
del lenguaje de programación:
• En lenguajes como C, C++, Pascal o Ada se utiliza
un puntero como enlace.
• En lenguajes como Java o C# se almacena una
referencia al siguiente objeto nodo.
• En otros lenguajes de programación que no
soportan ninguna de estas opciones se realiza la
implementación mediante arreglos.
13. Procesamiento de Listas
Enlazadas
• Se debe verificar que la lista no esté vacía.
• Existen dos casos particulares:
• El elemento a eliminar está al principio de la
lista
• El elemento a eliminar está en cualquier otro
lugar de la lista.
15. Procesamiento de Listas
Enlazadas
• Se debe reservar el espacio de memoria para el
nuevo elemento.
• Al igual que la eliminación, se deben considerar
dos casos:
• Insertar un elemento al frente de la lista.
• Insertar un elemento en cualquier otro lugar
16. Procesamiento de Listas
Enlazadas
• Para poder recorrer una lista enlazada,
necesitaremos empezar por la cabecera.
• Se deben recorrer uno a uno los elementos
hasta encontrar el elemento deseado.
• Si no se encuentra el elemento, el recorrido
termina al encontrar el valor nulo en el apuntado
a la siguiente posición.
17. Listas Circulares
• Son similares a las listas enlazadas con la
diferencia que el último elemento apunta al
primero, creando un círculo.
• También se les conoce como listas enlazadas
circulares o listas en anillo.
19. Listas Circulares vs. Listas
Enlazadas
• Ventajas
• Cada nodo es accesible desde cualquier otro nodo
de la lista.
• Las operaciones de concatenación y división son
más eficaces.
• Desventajas:
• Se pueden producir ciclos infinitos al recorrerla
(utilizar bandera para cabecera).
20. Listas Doblemente
Enlazadas
• Son una mejora de las listas enlazadas (a partir
de ahora, listas simplemente enlazadas).
• Permiten recorrer las listas en ambas
direcciones.
• Cada nodo tiene dos enlaces, uno al elemento
anterior y otro al elemento siguiente.
25. Pila
• Es un tipo especial de lista lineal en la que la
inserción y borrado de los elementos se realiza
únicamente por un extremo.
• El extremo utilizado se llama cima o tope (top).
• Los elementos se quitan en orden inverso al
orden en que entran.
26. Pila
• El modo de acceso a sus elementos de
denomina LIFO (Last In, First Out).
• En español se les conoce como UEPS (Ultimo
en entrar, primero en salir)
• Cuenta con operaciones básicas: apilar y
desapilar.
29. Operaciones de la Pila
• Push:
• Operación de insertar un elemento en la pila.
• También se conoce como meter, poner o apilar.
• Pop:
• Operación de eliminar un elemento en la pila.
• También se conoce como sacar, quitar o desapilar.
35. Utilidades de la Pila
• En el área de ciencias de la computación las
pilas son utilizadas para solucionar un amplia
variedad de problemas.
• Se utilizan en compiladores, sistemas operativos
y en programas de aplicación.
38. Cola
• Son un tipo especial de lista lineal donde los objetos
son insertados por un extremo y removidos por el otro
únicamente.
• Los elementos se quitan en orden inverso al orden en
que entran.
• El modo de acceso a sus elementos de denomina
FIFO (First In, First Out).
• Cuenta con operaciones básicas: encolar (Enqueue),
desencolar (Dequeue) y consulta (Peek).
42. Estructuras Similares
•Mientras más se adentra una persona en el
mundo de las ciencias de la computación, más
se da cuenta de que puede utilizar las mismas
estructuras para resolver problemas similares.
43. Estructuras Similares
•Por ejemplo, una estructura lineal como la “cola”
se puede aplicar para:
•Manejo de procesos en el sistema operativo
•Manejo del orden de atención de solicitudes en
un hospital
•Manejo de solicitude hechas a un Web Service
44. Estructuras Similares
•En todos los casos mencionados, el código es
muy similar.
•Debemos hacer variaciones según el tipo del
“dato” que queremos almacenar en el nodo.
•Esto nos obliga a tener código muy similar y
repetido.
45. Programación Genérica
•Es un paradigma de programación centrado en
los algoritmos y no en los datos.
•Su postulado fundamental puede sintetizarse en
una palabra: generalización.
46. Programación Genérica
•Se busca que los algoritmos:
•Sean parametrizados al máximo
•Sean expresados de una forma independiente
de detalles concretos de un tipo
•Sirvan a la mayor variedad posible de tipos y
estructuras de datos
47. Plantillas
•Son uno de los aportes del lenguaje C++ al
lenguaje C.
•Permiten pasar “tipos de dato” como
parámetros a un determinado programa
•Permiten la creación de funciones, clases o
estructuras genéricas
48. Plantillas
•Ventajas:
• Generalización: Luego de generar un
algoritmo no deberemos realizar
modificaciones para utilizarlo con otros
varios tipos de datos.
• Simplicidad: Permiten un fácil mantenimiento
del código
50. Plantillas
• Las plantillas generan automáticamente el
código de manejo para todas las clases
utilizadas dentro del programa.
• Este trabajo se realiza en tiempo de
compilación.
51. Plantillas
• Algunas plantillas conocidas son:
• STL: Standard Template Library proporciona
implementaciones de arrays y listas
genéricas.
• BGL: Boost Graph Library implementa
algoritmos y objetos de grafos genéricos.
52. Plantillas
• Normalmente el nombre del parámetro de tipo
inicia con una T.
• El All-in-one code framework nos sugiere utilizar
PascalCasing con el prefijo T.
57. Generics
• .NET provee una funcionalidad similar a las
plantillas, esta es llamada “Generics”.
• Funciona de forma muy parecida a las plantillas
con algunas diferencias.
58. Generics
• Principales diferencias:
• El manejo genérico es realizado en tiempo de
ejecución y no en tiempo de compilación.
• No permite implementaciones personalizadas
o parciales para algunos tipos de datos.
• No permite tipos de datos default
59. Generics
• Principales diferencias:
• El código de las plantillas siempre debe ser
válido, no se pueden hacer chequeos por
tipo.
• No se pueden utilizar parámetros de tipo
plantilla.
66. Más Información
• Si desean ampliar la información sobre Generics
dirigirse a:
• https://msdn.microsoft.com/en-us/library/
0x6a29h6.aspx
67. Delegado
• Un delegado es un tipo de dato que representa
un referencia a un método con una determinada
lista de parámetros y tipo de retorno (firma del
método).
• Al instanciar un delegado, puede ser asociado a
cualquier método con la misma firma y se
puede ejecutar dicho método a través de la
instancia del delegado.
72. Expresión Lambda
• Es una función anónima que puede ser usada
para crear delegados. Al utilizar expresiones
lambda, es posible escribir funciones locales
que pueden ser pasadas como parámetros o
retornadas como resultado de funciones.
• Estas expresiones tienen dos segmentos, el
izquierdo para declarar parámetros y el derecho
con la expresión.
73. Predicado
• Es un delegado que representa un método que
define un conjunto de criterios y determina
cuando un objeto (recibido como parámetro)
cumple dichos criterios.
• Normalmente es utilizado en listas para realizar
búsquedas dentro de sus elementos.
77. Listas .NET Framework
• List<T> (Clase)
• .NET Framework (current version)
• Representa una lista de objetos fuertemente tipados a
la que se puede obtener acceso por índice.
Proporciona métodos para buscar, ordenar y
manipular listas.
• Espacio de nombres: System.Collections.Generic
• Ensamblado: mscorlib (en mscorlib.dll)
78. Listas
• Para los ejemplos presentados a continuación,
estaremos apoyándonos en las siguiente
sección de código:
84. Listas
• Para los ejemplos presentados a continuación,
estaremos apoyándonos en las siguiente
sección de código, la cual se agrega a la clase
Carro:
88. Listas Enlazadas .NET Framework
• LinkedList<T> Clase
• .NET Framework (current version)
• Representa una lista doblemente enlazada.
• Espacio de nombres:
System.Collections.Generic
• Ensamblado: System (in System.dll)
91. Pilas .NET Framework
• Stack<T> (Clase)
• .NET Framework (current version)
• Representa una colección último en entrar,
primero en salir (LIFO) de tamaño variable con
instancias del mismo tipo especificado.
• Espacio de nombres: System.Collections.Generic
• Ensamblado: System (en System.dll)
93. Pilas (Python)
• Append: Se utiliza
como operación
equivalente a push.
• Pop: Es la operación
desapilar a la que
estamos
acostumbrados.
94. Colas .NET Framework
• Queue<T> (Clase)
• .NET Framework (current version)
• Representa una colección de objetos de tipo
primero en entrar, primero en salir.
• Espacio de nombres:
System.Collections.Generic
• Ensamblado: System (en System.dll)