0% encontró este documento útil (1 voto)
2K vistas12 páginas

Ejemplos de TDA

Este documento describe diferentes tipos de estructuras de datos lineales enlazadas como listas, incluyendo: 1) Listas simples enlazadas, que almacenan nodos de forma dinámica usando punteros. 2) Listas doblemente enlazadas, que permiten recorrer la lista en ambas direcciones usando punteros previo y siguiente. 3) Listas circulares, donde el puntero del último nodo apunta al primer nodo, permitiendo recorridos continuos. También presenta ejemplos de implementación de pilas

Cargado por

Francisco
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como DOCX, PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (1 voto)
2K vistas12 páginas

Ejemplos de TDA

Este documento describe diferentes tipos de estructuras de datos lineales enlazadas como listas, incluyendo: 1) Listas simples enlazadas, que almacenan nodos de forma dinámica usando punteros. 2) Listas doblemente enlazadas, que permiten recorrer la lista en ambas direcciones usando punteros previo y siguiente. 3) Listas circulares, donde el puntero del último nodo apunta al primer nodo, permitiendo recorridos continuos. También presenta ejemplos de implementación de pilas

Cargado por

Francisco
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como DOCX, PDF, TXT o lee en línea desde Scribd
Está en la página 1/ 12

IRVING JOSUÉ HERNANDEZ NAVA EJEMPLOS DE TDA’S

EJEMPLOS DE TDA

Tda lista:

Del TDA LISTA podemos tomar como ejemplo a las 3 siguientes aplicaciones que descienden de esta
estructura:

 Listas simples enlazadas.


 Listas doblemente enlazadas.
 Listas enlazadas simples circulares.

Listas simples enlazadas.

La Lista Enlazada Simple es la más fundamental estructura de datos basada en punteros, y del
concepto fundamental de ésta derivan las otras estructuras
de datos.

Para solucionar un problema como el presentado anteriormente, necesitamos una estructura que, al
contrario de los arreglos, sea capaz de modificar su capacidad, es decir, que maneje los datos de
forma dinámica. Para lograr esto, nace la idea de lista enlazada.

Un arreglo asigna memoria para todos sus elementos ordenados como un sólo bloque. En cambio, la
lista enlazada asigna espacio para cada elemento por separado, en su propio bloque de memoria,
llamado nodo. La lista conecta estos nodos usando punteros, formando una estructura parecida a la
de una cadena.

Un nodo es un objeto como cualquier otro, y sus atributos serán los encargados de hacer el trabajo
de almacenar y apuntar a otro nodo. Cada nodo tiene dos atributos: un atributo “contenido”, usado
para almacenar un objeto; y otro atributo “siguiente”, usado para hacer referencia al siguiente nodo
de la lista.

pág. 1 21/09/2020
IRVING JOSUÉ HERNANDEZ NAVA EJEMPLOS DE TDA’S

Implementación
Para implementar una lista simple enlazada, se define una clase Nodo, la cual indica el tipo de los
objetos guardados en los nodos de la lista. Para este caso se asume que los elementos son String
(puede ser cualquier tipo). También es posible definir nodos que puedan guardar tipos arbitrarios de
elementos.

Dada la clase Nodo, se puede definir una clase, ListaSimple, definiendo la lista enlazada actual. Esta
clase guarda una referencia al nodo cabeza y una variable va contando el número total de nodos.

/** Nodo de una lista simple enlazada de cadenas. */

public class Nodo {

private String elemento; // Los elementos son cadenas de caracteres

private Nodo sig;

/** Crea un nodo con el elemento dado y el nodo sig . */

public Nodo ( String s, Nodo n) {

elemento = s;

sig = n;

/** Lista simple enlazada. */

public class ListaSimple {

protected Nodo cabeza; // nodo cabeza de la lista

protected long tam ; // cantidad de nodos en la lista

/** constructor por defecto que crea una lista vaca */

public ListaSimple () {

cabeza = null ;

tam = 0;

// ... métodos de actualización y búsqueda deberán ir aquí

pág. 2 21/09/2020
IRVING JOSUÉ HERNANDEZ NAVA EJEMPLOS DE TDA’S

Listas doblemente enlazadas

Un tipo de lista enlazada que permite ir en ambas direcciones, hacia adelante y hacia atrás, en una
lista enlazada. Esta es la lista doblemente enlazada. Tal lista permite una gran variedad de
operaciones rápidas de actualización, incluyendo la inserción y el borrado en ambos extremos, y en el
centro. Un nodo en una lista doblemente enlazada guarda dos referencias un enlace sig., el cual
apunta al siguiente nodo en la lista, y un enlace prev, el cual apunta al nodo previo en la lista.

El almacenamiento con nexos en sólo un sentido tiene el problema de no permitir recorrido hacia
atrás, pero si se agrega un segundo apuntador se puede lograr este objetivo. Pero tienen el problema
de requerir más espacio de memoria.

La ventaja que proporciona esta estructura es la operación de búsqueda e inserción, recorriendo hacia
atrás en forma inmediata.

Una implementación de un nodo de una lista doblemente enlazada se muestra en el siguiente código,
donde nuevamente se asume que los elementos son

cadenas de caracteres.

pág. 3 21/09/2020
IRVING JOSUÉ HERNANDEZ NAVA EJEMPLOS DE TDA’S

Listas Circulares

Una lista circularmente enlazada tiene el mismo tipo de nodos que una lista simple enlazada. Esto es,
cada nodo en una lista circularmente enlazada tiene un apuntador siguiente y una referencia a un
elemento. Pero no hay una cabeza o cola en la lista circularmente enlazada. En vez de tener que el
apuntador del ultimo nodo sea null, en una lista circularmente enlazada, este apunta de regreso al
primer nodo. Por lo tanto, no hay primer nodo o ultimo. Si se recorren los nodos de una lista
circularmente enlazada desde cualquier nodo usando los apuntadores sig, se circulará a través de los
nodos.

Es una variación de las listas simples. Consiste en reemplazar el valor NIL o NULL del nexo del último
nodo, por la dirección del nodo cabeza de la lista, el cual a su vez contiene la dirección del primer
nodo de la lista.

Aun cuando una lista circularmente enlazada no tiene inicio o terminación, no obstante, se necesita
que algún nodo esté marcado como especial, el cual ser A llamado el cursor. El nodo cursor permite
tener un lugar para iniciar si se requiere recorrer una lista circularmente inversa. Y si se recuerda esta
posición inicial, entonces también se puede saber cuándo se haya terminado con un recorrido en la
lista circularmente enlazada, que es cuando se regresa al nodo que fue el nodo cursor cuando se
inició.

Se pueden entonces definir algunos métodos simples de actualización para una lista circularmente
ligada:

agregar(v): inserta un nuevo nodo v inmediatamente después del cursor; si la lista está vacía,
entonces v se convierte en el cursor y su apuntador sig apunta a el mismo.

remover(): borra y regresa el nodo v inmediatamente después del cursor (no el propio cursor, a menos
que este sea el único nodo); si la lista queda vacía, el cursor es puesto a null.

avanzar(): avanza el cursor al siguiente nodo en la lista.


pág. 4 21/09/2020
IRVING JOSUÉ HERNANDEZ NAVA EJEMPLOS DE TDA’S

Ejemplo de una aplicación de listas circulares

pág. 5 21/09/2020
IRVING JOSUÉ HERNANDEZ NAVA EJEMPLOS DE TDA’S

Aplicaciones de una Pila

La definición de una estructura de datos queda completa al incluir las operaciones que pueden realizar
en ella. Para el caso de las pilas, las operaciones básicas que se puede llevar a cabo son:

Insertar un elemento -Push- en la pila


Eliminar un elemento -Pop- de la pila

Las operaciones auxiliares son:

Cuando está llena


Cuando está vacía

Considerando que se tiene una pila con capacidad para almacenar un número máximo de elementos -
MAX-, y que el último de ellos se indica con TOPE, a continuación, se presentan los algoritmos
correspondientes a las operaciones mencionadas. Si la pila está vacía, entonces TOPE es igual a O.

Algoritmo para verificar si la pila está vacía


Si (TOPE = 0) entonces
Hacer BAND = VERDADERO
Si no
Hacer BAND = FALSO
Fin si
Algoritmo para verificar si la pila está llena
Si (TOPE=0) entonces
Hacer BAND = VERDADERO
Si no
Hacer BAND = FALSO

pág. 6 21/09/2020
IRVING JOSUÉ HERNANDEZ NAVA EJEMPLOS DE TDA’S

Función Push
Añadir un objeto a nuestra Pila es una operación relativamente sencilla, agreguemos el siguiente
método al código anterior:

mutating func push(_ element: String) {

array.append(element)

} // push

La función push toma un solo parámetro, evidentemente el elemento que añadiremos a la cima de la
pila. Creo pertinente aclarar que estamos haciendo uso del método append de nuestra propiedad
array el cual nos añade el nuevo elemento al final del arreglo.

Si lo hubiéramos hecho al inicio aparte de violar el diseño de una Pila también estaríamos ejecutando
una operación O(0) muy costosa debido al desplazamiento de elementos, mientras que al añadirlo al
final sería una operación O(1) cuya duración es la misma sin importar el tamaño del arreglo.

Función Peek

Cuando necesitamos hacer un peek o echar una ojeada sobre nuestra Pila lo hacemos mediante la
función peek que implementaremos a continuación:

func peek() -> String? {

return array.last

} // peek

En este código hemos eliminado el modificador mutating ya que esta función no modifica el arreglo,
solamente toma el último elemento y devuelve una copia del mismo para que podamos verificarlo.

pág. 7 21/09/2020
IRVING JOSUÉ HERNANDEZ NAVA EJEMPLOS DE TDA’S

La función Pop

Eliminar el último elemento de la Pila también es una operación sencilla, veamos el código del método
asociado a esta acción:

mutating func pop() -> String? {

return array.popLast()

} // pop

Si alguno ha tenido la duda de por qué la función pop y peek devuelven un valor String opcional pues
les comento que esto es debido al caso donde la Pila esté vacía, no hay elementos en esta y por ende
el valor de retorno será nil.

En este punto ya podemos integrar todo cuanto hemos implementado y pasar a probar nuestro código
que es el siguiente:

pág. 8 21/09/2020
IRVING JOSUÉ HERNANDEZ NAVA EJEMPLOS DE TDA’S

debajo de este fragmento se añaden las líneas:

Colas o Queues

El tipo de dato abstracto cola define una colección que guarda los objetos en una secuencia, donde el
acceso al elemento y borrado están restringidos al primer elemento en la secuencia, el cual es
llamado el frente de la cola, y la inserción del elemento está restringida al final de la secuencia, la cual
es

llamada la parte posterior de la cola. Esta restricción fuerza la regla de que los elementos son
insertados y borrados en una cola de acuerdo al principio

FIFO.

El ADT cola soporta los siguientes dos métodos fundamentales:

 enqueue(e): inserta el elemento e en la parte posterior de la cola.


 dequeue(): quita el elemento del frente de la cola y lo regresa; un error ocurre si la cola está
vacía.

Adicionalmente, de igual modo como con el ADT pila, el ADT cola incluye los siguientes métodos de
apoyo:

 size(): regresa el número de elementos en la cola.


 isEmpty(): regresa un booleano indicando si la cola está vacía.
 front(): regresa el elemento del frente de la cola, sin removerlo; un error ocurre si la cola está
vacía.

Una interfaz de Java para el ADT cola se proporciona en el código siguiente. Esta interfaz genérica
indica que objetos de tipo arbitrario pueden ser insertados en la cola. Por lo tanto, no se tiene que usar
conversión explícita cuando se remuevan elementos.

pág. 9 21/09/2020
IRVING JOSUÉ HERNANDEZ NAVA EJEMPLOS DE TDA’S

Los métodos size e isEmpty tienen el mismo significado como sus contrapartes en el ADT pila. Estos
dos métodos, al igual que el método front, son conocidos como métodos de acceso, por su valor
regresado y no cambian el contenido de la estructura de datos.

Implementación de una Cola con Lista Simple.

Se puede implementar eficientemente el ADT cola usando una lista genérica simple ligada. Por
razones de eficiencia, se escoge el frente de la cola para que esté en la cabeza de la lista, y la parte
posterior de la cola para que esté en la cola de la lista. De esta forma se quita de la cabeza y se
inserta en el final.

Para esto se necesitan mantener referencias en los dos nodos cabeza y cola de la lista. Se presenta a
continuación una implementación para el método queue y para dequeue de la cola en los siguientes
códigos.

pág. 10 21/09/2020
IRVING JOSUÉ HERNANDEZ NAVA EJEMPLOS DE TDA’S

REFERENCIAS:

Yarleque Ferrer, R. E. (2018). ESTRUCTURA DE DATOS Introducción, Conceptos, tipos de datos,


clasificación general, Arrays, listas enlazadas, Pilas, Colas, Inicialización y asignación de valores.

Loomis, M. E. (1991). Estructura de datos y organización de archivos. Prentice-Hall Hispanoamericana.

González, A. H. (2013). Listas circulares.

4. Estructura de Datos Dinámicas - UBO - Estructuras de Datos. (s. f.). Recuperado 23 de septiembre de
2020, de https://sites.google.com/site/edatosubo/4-estructura-de-datos-dinamicas

pág. 11 21/09/2020

También podría gustarte