Estructura de Datos
Lineales
Curso: Algoritmos y Estructura de Datos – Grupo A Docente: I.S. José Castillo Zumarán
Indice
Abstracción de datos
Utilización de un TDA
Tipos de estructura de datos lineales
Listas
Pilas
Abstracción de datos
La abstracción nos permite simplificar el análisis y
resolución de un problema separando las características que son relevantes de aquellas que no lo son.
Una abstracción de datos, también denominada tipo de
dato abstracto, es un nuevo tipo de dato más un conjunto de operaciones que permiten manipular objetos de dicho tipo.
La utilización de los TDA da lugar a programas que son:
más legibles
Utilización de un TDA
Para poder utilizar un
TDA
, sin saber como está
representado internamente, es necesario
disponer de su especificación.
Un
TDA
se divide en
dos partes
:
Estructuras de Datos
Estructuras
de Datos
Lineales
No lineales
Almacenamiento
Contiguo
Tipos de estructura de datos
lineales
Listas
Pilas y
Colas
Estas estructuras de datos pueden ser:
Estáticas
(implementado con array) o
Dinámicas
(implementado con listas
Listas
Son estructuras de datos secuenciales de 0 o más elementos
de un tipo dado almacenados en memoria. Son estructuras lineales, donde cada elemento de la lista, excepto el primero, tiene un único predecesor y cada elemento de la lista, excepto el último, tiene un único sucesor.
El número de elementos de la lista se llama longitud. Si tiene
0 elementos se llama lista vacía.
En una lista podemos añadir nuevos elementos o suprimirlos
Tipos de listas
No enlazada (array) Enlazada (objetos)
Doblemente enlazada
(anterior apunta al siguiente y viceversa)
Circular (el último
apunta al primero) A la vez pueden estar:
Operaciones sobre Listas
Algunas operaciones
son:
Inserción
Supresión
Recorrido
Ordenación
Aplicación de las listas
Las listas son comunes en la vida diaria: listas de
alumnos, listas de clientes, listas de espera, listas de distribución de correo, etc.
Las listas son estructuras de datos muy útiles para los casos en los que se quiere almacenar información de la que no se conoce su tamaño con antelación.
También son valiosas para las situaciones en las que el volumen de datos se puede incrementar o
decrementar dinámicamente durante la ejecución del programa.
Listas Enlazadas
Una lista enlazada está formada por una
colección de elementos (denominados
nodos
)
tales que cada uno de ellos almacena dos
valores: un valor de la lista y un
puntero
o
referencia
que indica la posición del nodo que
contiene el siguiente valor de la lista.
Es necesario almacenar al menos la posición
del primer elemento.
Es dinámica, su tamaño puede cambiar
Nodos de una lista enlazada
Una lista enlazada es una sucesión de nodos en la
que a partir de un nodo se puede acceder al que ocupa la siguiente posición en la lista. Esta característica nos indica que el acceso a las listas es secuencial y no indexado, por lo que para acceder al último elemento de la lista hay que recorrer los n-1 elementos previos (n es el tamaño de la lista).
Para que un nodo pueda acceder al siguiente y la
Esquema de una lista enlazada
De esta forma un nodo se podría representar
esquemáticamente así:
En el campo información se almacena el
objeto a guardar y nodo siguiente mantendrá
la conexión con el siguiente nodo.
Información Nodo siguiente
Información
Nodo siguiente
Información
Nodo siguiente
Información
Lista doblemente enlazada
Son listas que tienen un enlace con el elemento
siguiente y con el anterior. Una ventaja que tienen es que pueden recorrerse en ambos sentidos, ya sea para efectuar una operación con cada elemento o para
insertar, actualizar y borrar. La otra ventaja es que las búsquedas son algo más rápidas puesto que no hace falta hacer referencia al
elemento anterior. Su inconveniente es que
Listas circulares (enlazadas)
Son listas en el que el último elemento tiene
una referencia (enlace) con el primer
elemento (cabecera).
Pueden ser listas simples o doblemente
Pilas
Es un tipo lineal de datos,
secuencia de elementos de un
tipo, una estructura tipo LIFO
(Last In First Out) último en
entrar primero en salir.
Son un subconjunto de las
listas, en donde las
eliminaciones e inserciones se
dan en un solo extremo, de
manera tal que, el último
Operaciones básicas con pilas
Crear la estructura
Crear la estructura
Insertar
Insertar
Eliminar
Eliminar
Obtener un elemento
Obtener un elemento
Vacíar
Vacíar
Aplicaciones de las pilas
Se utilizan en: Compiladores (parsers: reconocedores sintácticos de
los compiladores).
Programación de sistemas (para registrar llamadas a
subprogramas, y recuperar los datos anteriores, o recuperar los parámetros).
Recuperación de elementos en orden inverso al que
fueron colocados (en un depósito, una pila de contenedores, sillas, etc. ).
Notación polaca (postfija)
Para evaluar la expresión aritmética de:
se sigue el indicado con las flechas
(según la prioridad de los operadores y el uso de los paréntesis)
Para eliminar esta dificultad, se hace una traducción de las
expresiones aritméticas a notación postfija, que se llama
Notación postfija
La idea básica detrás de la notación de cadenas polacas
es que los operadores se escriben al final y no en medio de las expresiones. De manera que A + B se escribiría como A B +. En esta forma, el operador + se considera como una orden para sumar los valores de las dos variables que lo preceden inmediatamente. Un ejemplo puede ser:
La clave de la traducción de notación infija a posfija es la
Notación postfija
Reglas básicas para convertir expresiones infijas a posfijas:
1. Si el elemento es un ‘(‘ se coloca directamente en la pila de operadores.
2. Si el elemento es un ‘)’, los operadores de la pila se transfieren uno a uno, al extremo derecho de la expresión posfija hasta llegar a un ‘(‘. Este se saca pero no va a la salida.
3. Si el elemento localizado es una variable, se coloca inmediatamente en el extremo derecho de la expresión posfija que se está creando.
Conversión infija a postfija
Ecuación cuadrática
En infija
( ‘-b’ + ( b ^ 2 – 4 * a * c ) ^ ( 1 / 2 ) ) / ( 2 * a )
En postfija
Algoritmo para evaluar una
expresión postfija
1. Implementar la pila
2. Repetir hasta encontrar el fin de la expresión
postfija
Tomar un carácter.
Si el carácter es un operando colocarlo en la pila.
Si el carácter es un operador entonces sacar los dos
valores del tope de la pila (operando2 operando1), aplicar el operador (operando1 operador operando2) y colocar el resultado en el nuevo tope de la pila.
Recursividad
Algoritmo para hallar el factorial de un número
mediante pilas leer n;
mientras n > 1 pila.apilar (n); n = n-1;
fin mientras factorial = 1;
mientras pila no está vacía
Encapsulación en pilas y colas
Al igual que con las colas,
la implementación de las
pilas suele encapsularse,
es decir, basta con conocer
las operaciones de
manipulación de la pila
para poder usarla,
olvidando su
Colas
Es un tipo de dato lineal con estructura FIFO (First In, First Out), el primero que entra es el primero que sale.
Las colas son un subconjunto de las listas, en donde las
eliminaciones se dan al comienzo de la lista y las inserciones al final.
Aplicaciones de las colas
Las colas, al igual que las pilas, resultan de aplicación
habitual en muchos problemas informáticos.
Su utilización es infinita, desde la simulación de una
cola formada frente a un cajero automático, hasta la
cola de impresión.
Quizás la aplicación más común de las colas es la
organización de tareas de un ordenador. Los
Tipos de colas
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.
Existen dos formas de implementación:
Añadir un campo a cada nodo con su prioridad.
Resulta conveniente mantener la cola ordenada por orden de prioridad.
Crear tantas colas como prioridades haya, y
Cola de prioridad
Una cola de prioridad es una
generalización de los conceptos de pila y
cola en la que, tras entrar en la cola, la
salida de los elementos no se basa
Algunas aplicaciones de
las colas de prioridad
Gestión de procesos en un sistema operativo. Los procesos
no se ejecutan uno tras otro en base a su orden de llegada. Algunos procesos deben tener prioridad (por su mayor
importancia, por su menor duración, etc.) sobre otros.
Implementación de algoritmos voraces, los cuales
proporcionan soluciones globales a problemas basándose en decisiones tomadas sólo con información local. La
determinación de la mejor opción local suele basarse en una cola de prioridad.
Algunos algoritmos sobre grafos, como la obtención de caminos o
Tipos de colas
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. Existen dos variantes:
Bicolas de entrada restringida: Son aquellas donde la inserción sólo se hace por el final, aunque podemos eliminar al principio o al final.
Operaciones básicas con colas
Crear la estructura
Crear la estructura
Insertar
Insertar
Eliminar
Eliminar
Obtener un elemento
Obtener un elemento
Vaciar
Vaciar
Bibliografía
Abstracción de datos
1. http://www14.uniovi.es/tutorED/abstraccion/abstraccionfr.html
Estructura de Datos
2. http://www14.uniovi.es/tutorED/estlineales/estlineafr.html 3. http://www14.uniovi.es/tutorED/java-c++/java-c++fr.html 4. Como programar en Java. Deitel y Deitel.
Listas
5. http://www14.uniovi.es/tutorED/estlineales/interlistafr.htm 6. http://oviedo3.ccu.uniovi.es/martin/EDI/ListPage.htm
Listas, pilas y colas. Ejercicios
7. Fundamentos de programación. Libro de problemas. Luis Joyanes Aguilar