Anda di halaman 1dari 10

Estructuras de Datos

Contenido
Listas ............................................................................................................................................................. 2 Qu objetos se pueden modelar con una lista? ..................................................................................... 2 Definiendo una lista .................................................................................................................................. 2 TAD para representar una lista ................................................................................................................. 2 Relacionando el concepto de Ventana con el de Lista ....................................................................... 4 Describiendo las implementaciones de Listas .......................................................................................... 4 Vectores ................................................................................................................................................ 4 Listas doblemente enlazadas ................................................................................................................ 5 Mecanismos para implementar las listas en diferentes lenguajes ........................................................... 5 Pilas ............................................................................................................................................................... 6 Qu objetos se pueden modelar con una pila? ...................................................................................... 6 Definiendo una pila ................................................................................................................................... 7 TAD para representar una pila .................................................................................................................. 7 Mecanismos para implementar las pilas a travs de listas y vectores ..................................................... 8 Cola ............................................................................................................................................................... 8 Qu objetos se pueden modelar con una cola?...................................................................................... 8 Definiendo una cola .................................................................................................................................. 9 TAD para representar una cola ................................................................................................................. 9 Particularidades de una cola con prioridades ............................................ Error! Bookmark not defined. Describiendo las implementaciones de colas con vectores circulares ..................................................... 9

Listas
Qu objetos se pueden modelar con una lista?
Los ingredientes de una receta de cocina Los integrantes de una junta de vecinos Las partes de un aparato electrnico

Definiendo una lista


En ciencias de computacin, una lista o secuencia es un tipo de datos abstracto que se implementa como una coleccin ordenada de valores, donde el mismo valor puede ocurrir ms de una vez. Una instancia de lista es una representacin del concepto matemtico de secuencia finita. (http://en.wikipedia.org/wiki/List_(abstract_data_type) Matemticamente, una lista es una sucesin finita de cero, uno o ms elementos del mismo tipo. Desde el punto de vista de las estructuras de datos, una lista es un conjunto finito de elementos, en el que para acceder a uno de ellos hay que pasar por todos los situados antes que l. Una lista es, por lo tanto, una estructura de datos secuencial. (http://ocw.upm.es/ciencia-de-la-computacion-e-inteligencia-artificial/fundamentosprogramacion/contenidosteoricos/ocwfundamentosprogramaciontema11.pdf)

TAD para representar una lista

Invariante: n > i >= p Resumen de Operaciones: o crear: o combinar: o dividir: o truncar: o insertar: o remover: o siguiente: o inicio: o fin: o cantElem:

nil Lista x Lista Lista, int, bool Lista, int Nodo Nodo Nodo Lista Lista Lista

Lista Lista Lista, Lista Lista Lista Lista Nodo Nodo Nodo int

Detalle de Operaciones:

Lista crear () /*Construye una nueva lista */ {Pre: -} {Post: crear es una lista con un solo nodo} Lista combinar (Lista lst1, Lista lst2) /*Combina ambas listas en una sola, concatenando el ltimo elemento de lst1 con el primero de lst2 */ {Pre: l1 y l2 son listas no vacas} {Post: combinar es una lista que contiene todos los elementos de lst1 y lst2} Lista dividir (Lista lst, int x, Boolean orientacin) /*Remueve todos los elementos a partir del nodo X de lst y retorna una nueva lista con dichos elementos. Orientacin define como se realiza la operacin: si es TRUE se toman los elementos a la derecha de X, y viceversa */ {Pre: N> x >= P, donde P es el ndice del nodo inicial y N es el nodo final} {Post: dividir es una lista que contiene los elementos de lst a partir de X} Lista truncar (Lista lst, int x) /*Remueve los elementos de lst a partir del nodo x*/ {Pre: N> x >= P, donde P es el ndice del nodo inicial y N es el nodo final} {Post: truncar es una lista que contiene X-P elementos} Void insertar (Lista lst, Nodo n) /*Inserta un nuevo nodo al final de la lista*/ {Pre:} {Post: lst[p] = n} Nodo siguiente (Nodo n1) /*Devuelve el nodo que le sigue a n1 en la lista */ {Pre: n1!= lst[p]} {Post: -} Nodo inicio (Lista lst) /*Devuelve el nodo inicial de lst*/ {Pre: lst es una lista no vaca} {Post: inicio es el nodo raz de lst} Nodo fin (Lista lst) /*Devuelve el ultimo nodo de la lista*/ {Pre: lst es una lista no vaca.} {Post: fin es el ltimo nodo de la lista} Int cantElem (Lista lst) /*Devuelve la cantidad de nodos en lst*/ {Pre: -} {Post: -}

Relacionando el concepto de Ventana con el de Lista


Imagine que est leyendo un libro. Usted abre el libro en la primera pagina, continua con la siguiente; se da cuenta que olvido leer algo y se devuelve al anterior. No es factible para usted leer ms de una pgina a la vez, verdad? A pesar de que el libro contiene decenas, tal vez cientos o miles de pginas, usted solo puede enfocarse en una a la vez. Ahora imaginemos que el libro contiene una lista de pginas. De esa lista, usted solo lee una a la vez. La ventana de Libro<pagina> seria: pagina_actual. En otras palabras, la ventana en una lista es el elemento actual que estamos examinando. Por lo tanto, pasar la pgina implicara mover la ventana. La direccin de este movimiento, depende del tipo de lista que tengamos: para una lista doblemente enlazada, es una operacin trivial moverse tanto para la izquierda (anterior) como para la derecha (siguiente); para una lista simplemente enlazada, moverse hacia la derecha es igualmente sencillo, pero moverse a la izquierda es complicado, ya que cada nodo solo conoce su sucesor, no su antecesor.

Describiendo las implementaciones de Listas


Vectores

En Java, las funcionalidades del vector estn contenidas en la clase ArrayList. Hay una clase Vector pero su uso no es aconsejable. Un ArrayList es una estructura de datos que no se basa en nodos para el almacenamiento de la informacin, sino que internamente guarda punteros a cada uno de los elementos en un arreglo. Esto permite que el acceso a los elementos sea indizado, seo, que acceder al elemento <N> de un ArrayList es algo trivial; sin embargo, la debilidad de esta estructura es que si el arreglo se llena, es necesario copiar todo su contenido en otro arreglo de mayor tamao y liberar el espacio de memoria ocupada por el arreglo anterior. Otro inconveniente es la insercin de elementos en el en el en otra posicin que no sea al final ya que esta operacin requiere la modificacin de gran parte del arreglo.

Listas doblemente enlazadas

Esta es la otra implementacin de la interfaz Lista en Java, que si utiliza nodos como unidades bsicas de persistencia. Estos permiten que la lista no tenga lmite terico de crecimiento, simplemente se sigue agregando el nuevo nodo al final y se actualizan las referencias a este. La desventaja est en la lectura, ya que para leer el elemento <N> se necesita atravesar N elementos.

Mecanismos para implementar las listas en diferentes lenguajes


C++: La librera de tipos estndar de C++ (STL) incluye una implementa la interfaz Lista con listas doblemente enlazadas. El formato es:

C#: El namespace System. Collections incluye 3 implementaciones de lista: o List<t>: Se comporta Como un vector, utilizando un arreglo para proporcionar los servicios de lista. o LinkedList<t>: Se comporta Como una lista enlazada, utilizando nodos para almacenar los datos. o SortedList<k, t>: Como su nombre lo indica, es una lista de elementos del tipo T, que se ordenan en base a la comparacin valor de la clave K. En este caso la insercin es ms lenta, ya que debe comparar los valores de las claves para ver donde insertar el nuevo nodo, pero la lectura es trivial ya que todos los nodos estn ordenados.

Java: Implementa ArrayList y LinkedList. Vector tambin implementa la interfaz de lista, pero su uso no es recomendado en nuevas implementaciones. Estas implementaciones, y otras mas estn contenidas en el paquete java.Util.Collections

Pilas
Qu objetos se pueden modelar con una pila?
Supongamos que est atrapado en un laberinto cualquiera (Ya sea el laberinto del mino tauro, en Creta, o un callejn de Gualey, usted decide). Al llegar a un punto muerto, Qu har? Devolverse, lgicamente. Pero, Hacia dnde? Pues hacia el ltimo punto de divergencia. Esto se puede modelar como una pila donde colocamos (push) puntos y al encontrar un punto muerto, retrocedemos (pop) al primer punto de la pila.

Igualmente, supongamos que estas realizando una presentacin para cierta clase de Estructuras de Datos en MS Word. Sin darte cuenta, has seleccionado todo el texto, y has presionado la tecla Borrar. Qu haces? No hay problema, haces un Ctrl + Z y listo, Verdad? Esa funcionalidad se implementa con una pila. El programa va colocando cada estado en una pila, y cuando deshacemos simplemente hacemos un pop() a la pila. Igual el caso si quisiramos por ejemplo, invertir una palabra. La agregamos carcter por carcter a la pila y luego la retornamos con Pop() en orden inverso.

De hecho, las pilas son una importantsima herramienta en el anlisis lexicogrfico; los compiladores la utilizan para por ejemplo, encontrar las llaves que encierran un enunciado en el cdigo fuente; o para evaluar expresiones matemticas escritas utilizando una notacin infix cambindolas por una notacin post-fix .

13 + 21 * 5 = 170/118 Vs. 13 21 + 5 * = 170

Definiendo una pila


Una pila o Stack es una estructura linear de datos, en la que el ltimo en llegar es el primero en salir. Esta estructura tambin se conoce como LIFO, del ingls (Last In First Out). Las dos operaciones ms importantes de una pila son: Push, coloca un nuevo objeto en el tope de la pila Pop, lee el primer elemento de la pila. Al leerlo, este elemento es eliminado de la pila, siendo reemplazado por su anterior.

En todo momento, el nico elemento visible de la estructura es el ltimo que se coloc. Se define el tope de la pila como el punto donde se encuentra dicho elemento, y el fondo, como el punto donde se encuentra el primer elemento incluido en la estructura

TAD para representar una pila

Invariante: Cantidad de elementos <= 0 Operaciones: o crearPila Pila o push Elemento o pop Pila o cantElem Pila

Pila Pila Elemento Entero

Mecanismos para implementar las pilas


Una pila puede implementarse tanto con una Lista como con un vector. Si utilizamos una lista, entonces estaramos insertando / leyendo constantemente elementos al final de la lista, lo que en el caso de una Lista enlazada es algo trivial, ya que no se necesita recorrer la lista.

En el caso del vector, como siempre la limitacin esta en el hecho de que las constantes rea locaciones para obtener ms espacio disponible pueden convertirse en un problema.

Las operaciones Push () y Pop () deben tener una complejidad Constante de O(1), sin importar que mecanismos se utilicen para implementarla.

Cola
Qu objetos se pueden modelar con una cola?
Considere el caso de un banco donde usted se dirige un da primero de cualquier mes a realizar el cambio del cheque de su salario. Al entrar al establecimiento se encuentra que decenas de personas estn presentes para realizar la misma operacin, pero la cantidad de cajeros es limitada. Qu sucede? Se organizan en una fila, por orden de llegada. El primero en llegar (o el ms vivo, dependiendo de qu pas de trate) est en la primera posicin y es despachado primero.

Esta situacin se aplica bastante en la vida diaria: Al ir a un bao pblico, al esperar en la fila del supermercado, al esperar el autobs; Recursos en los que es necesario regular el acceso al mismo, debido a que son limitados. En la informtica se dan muchos casos de colas: o o o o Las colas de impresin. Las colas de prioridades para los procesos en el CPU Las colas de acceso a archivos Las colas de despacho en los dispositivos de acceso a la red

Definiendo una cola


Una cola es lo inverso a una pila; una estructura linear de datos donde el primero en llegar, es el primero en salir (FIFO), o lo que es lo mismo, el ltimo en llegar, es el ltimo en salir (LILO). Los mtodos ms importantes de una cola son: Enqueue: Dequeue: coloca un elemento al final de la cola remueve el primer elemento de la cola

TAD para representar una cola


Invariante: Cantidad de elementos >= 0 Operaciones: crearCola Cola enqueue Elemento dequeue Cola cantElem Cola

Cola Cola Elemento Entero

Describiendo las implementaciones de colas con vectores circulares


Una cola circular es aquella en la que el ltimo elemento de la cola hace referencia al primero.

En el caso de una lista, esto no supone mayores complicaciones, pero si se utiliza un array debe de aplicarse una matemtica especial para los ndices.

Referencias:
http://www.cs.cmu.edu/~adamchik/15121/lectures/Stacks%20and%20Queues/Stacks%20and%20Queues.html http://cupi2.uniandes.edu.co/libros/estructuras_de_datos/index.php?option=com_content&view=articl e&id=217&Itemid=68

Anda mungkin juga menyukai