Sei sulla pagina 1di 85

FACULTAD DE INGENIERA

ESCUELA DE INGENIERA EN SISTEMAS Y COMPUTACIN


ESTRUCTURA DE DATOS Pamela Vsquez Costales

UNIDAD II CAPTULO VII


PILAS Y COLAS

PILAS Y COLAS
Objetivos
O Explicar en qu consisten las

estructuras de datos pila y fila (cola), y cules son sus aplicaciones principales. O Disear los TDA pila y fila.

Objetivos
O Describir las diferentes opciones para

representar los TDA pila y fila, analizando ventajas y desventajas. O Conocer la forma en que se maneja un arreglo circular y cmo se aplica en la representacin de una fila.

Objetivos
O Integrar los conceptos de abstraccin

de datos, programacin orientada a objetos y listas encadenadas en memoria dinmica, en el contexto de los TDA pila y fila.

Qu es una pila? Una pila es un conjunto ordenado de objetos los cuales pueden obtenerse (uno a la vez) siguiendo un orden especial: el ltimo que entr en la pila es el primero en salir como indica la figura:

As, en una cafetera de autoservicio se tienen apiladas las charolas que emplearn los clientes y cada uno toma la que se encuentra hasta arriba (en el tope) y la ltima charola que se toma es precisamente la primera que se coloc en la pila. De la misma manera se puede tener una pila de libros, una pila de ladrillos, una bolsa de pan de caja etctera

De qu Qu es la estructura de datos pila? Esta ltima idea de obtener el elemento del fondo de la pila, a travs del acceso de los elementos que estn por encima de l, sirve para hacer la definicin abstracta de la estructura de datos pila.

Esto es una estructura de datos lineal de objetos ordenados de forma tal que stos se obtienen por un solo lado de la estructura siguiendo en ingls LIFO Last In, First Out.

La pila es una estructura finita. Los elementos pueden identificarse por la posicin en que estn: el ltimo elemento de la pila se encuentra en el tope, enseguida est el otro, y as sucesivamente. Para llegar al objeto del fondo, es necesario obtener primero los que le anteceden. Por consiguiente, siempre se deber tener en cuenta donde se encuentra el ltimo elemento aadido, es decir, el tope de la pila.

Qu es una fila o cola?

Diariamente vivimos las filas. En los supermercados, en los bancos, hacemos filas con otras personas que esperan ser atendidas como se indica en la figura.

Existen modelos de lneas de espera que estudian el comportamiento de las filas tomando en cuenta factores como llegadas de clientes, cantidad de servidores, tiempo de llegada entre clientes, tiempo necesario para servicio, etc. Sin embargo, aqu se har una explicacin del concepto de fila o cola desde el punto de vista de las estructuras de datos.

Qu es la estructura de datos cola?

Aunque el estudio de la fila se har desde el punto de vista de las estructuras de datos, sigue mantenindose el concepto de atender al primero en la fila. Con base en esto, se puede definir una fila como una estructura de datos cuyos elementos se manejan bajo la filosofa en ingls FIFO First In, First Out.

La fila es una estructura finita y lineal donde los elementos pueden ser de cualquier tipo que se requiera. Su dominio lo forman aquellos elementos que puedan llegar a almacenarse en la estructura, y se obtienen por dos partes de la estructura, una llamada frente que seala dnde se encuentra el siguiente elemento por atender en la fila, y otra llamada final, que significa el lugar del ltimo que lleg.

Todo esto indica que los elementos se extraen por el frente de la fila y se agregan por el final.

Cul es la relacin entre pilas y colas? Ambas estructuras comparten muchas caractersticas, pero, en particular, ambas son estructuras tiles cuando se requiere administrar el orden de entrada de los datos que se guardarn en la estructura; es evidente que ambas requerirn de operaciones que sirvan para insertar y sacar datos, pero la

diferencia se da precisamente en la forma en que se insertan y extraen los datos. Dadas las similitudes, y considerando las diferencias, es mejor explicar paralelamente estas estructuras de datos.

Un ejemplo tpico del uso de una pila lo podemos ver en el manejo de las llamadas a mdulos o subrutinas en un programa (razn por la que un stock est siempre presente en la ejecucin de cualquier programa, aunque sea implcito para el programador). Otro ejemplo del uso de una pila se da en el proceso de conversin de expresiones a diferentes formatos (situacin que se requiere en la implantacin de un compilador).

Una cola ser til cuando la aplicacin requiera del orden estricto de entrada de los datos. Los ejemplos del uso de una fila tienen que ver con buffers de memoria donde se guardan temporalmente datos, por ejemplo, el buffer de teclado o el de impresin en un sistema computacional.

Por otro lado, cualquier simulacin por medio de un programa de una situacin de la vida real en la que se forman filas de personas u objetos, requerir esta estructura de datos.

Cul es la especificacin lgica para los TDA pila y fila? Para ambas estructuras se pueden generalizar los siguientes datos de la especificacin lgica:

Ya que en estas operaciones se ha puesto como precondicin la verificacin del estado de la pila (vaca o llena), es necesario disear operaciones que permitan al usuario de la pila hacer validaciones. Por lo tanto, se disean estas operaciones:

Ya que en estas operaciones se ha puesto como precondicin la verificacin del estado de la pila (vaca o llena), es necesario disear operaciones que permitan al usuario de la pila hacer validaciones. Por lo tanto, se disean estas operaciones:

Si se analiza, el TDA fila contendra en forma equivalente las mismas operaciones, pero considerando en las postcondiciones los cambios de acuerdo con el manejo del orden de entrada en una fila. A continuacin, se detalla este mismo diseo para un TDA fila.

Es importante darse cuenta que sin saber cmo se implementar fsicamente la pila o la cola, se pueden disear las operaciones en un nivel abstracto. Adelantando el nivel fsico o de implementacin, se puede observar que la especificacin de las operaciones puede determinar la interfaz que tendrn los mdulos de las operaciones.

Por ejemplo, si el TDA pila fuera a ser implementado con este diseo en el lenguaje C++, es posible bosquejar el diseo de la clase pila de la siguiente manera:

Si se eliminan las precondiciones que indican que las estructuras no deben estar vacas o llenas, stas condiciones se pueden validar fsicamente en las operaciones METER y SACAR, lo que nos lleva a plantear otro diseo lgico, cuya consecuencia es proveer mayor comodidad al usuario de los TDA, y ya no sern necesarias las operaciones LLENA y VACA.

A continuacin se detalla este diseo slo para el TDA pila, del cual se deduce fcilmente el TDA fila.

Ejemplo:

Observe que, sin haber implantado los TDA pila y fila, se puede desarrollar una aplicacin solamente conociendo la interfaz de las operaciones en el lenguaje correspondiente. Esto se demostrar tambin en trminos de la implantacin en un lenguaje de programacin y, por lo tanto, supondremos que se han planteado las siguientes definiciones en C++:

La implementacin de la aplicacin se puede realizar de la siguiente manera, sin necesidad de conocer cmo estn implementados los TDA, lo que cumple con la independencia de niveles durante la abstraccin de datos:

Cmo se puede representar fsicamente el TDA pila? En este caso, es indispensable distinguir entre la opcin de utilizar memoria esttica a travs de un arreglo unidimensional, o bien de utilizar memoria dinmica a travs de una lista encadenada.

Sin embargo en estas opciones hay gran variedad de formas de representacin e implementacin de las operaciones por lo que ejemplificaremos las dos situaciones ms tpicas de implementacin y se dejarn como ejercicio otras posibilidades.

Implementacin utilizando memoria esttica Se utilizar un arreglo unidimensional en el que se guardarn los datos a partir de la posicin inicial del mismo. La posicin de inicio del arreglo actuar como fondo de la pila y se requerir de un apuntador que indique la posicin donde se encuentra el tope de la pila (ltimo elemento aadido).

Estos datos se pueden encapsular como atributos de un objeto en caso de que se est utilizando un lenguaje como C++, quedando de la siguiente manera la definicin de la clase, segn el diseo lgico 2:

Las operaciones se implementarn de la siguiente manera:

Implementacin utilizando memoria dinmica Se utilizar una lista encadenada en la que se guardarn los datos en cada nodo. Por eficiencia, conviene considerar el inicio de la lista como el tope de la pila; por lo tanto, slo se requiere un apuntador al inicio de la lista para representar la pila.

Este apuntador se puede encapsular como atributo de un objeto en el caso de que se est utilizando un lenguaje como C++, quedando de la siguiente manera la definicin de la clase, segn el diseo lgico 2:

Las operaciones se implementarn de la siguiente manera:

Cmo se puede representar fsicamente el TDA cola? Al igual que en la pila, resulta evidente imaginar la representacin de la fila por medio de las estructuras lineales que provee el lenguaje, tanto en memoria esttica como en memoria dinmica. Sin embargo, en el caso de la fila, se harn algunas consideraciones interesantes.

Implementacin utilizando memoria esttica Para este caso es importante analizar diversas opciones de representacin e implantacin de las operaciones. A continuacin, se describen haciendo nfasis en cmo las desventajas propias de una representacin pueden ser superadas.

Forma 1: recorriendo informacin en el arreglo Se puede representar una fila en un arreglo unidimensional. Los elementos se colocan a partir de la primera posicin hasta la posicin mxima. Al momento de sacar un elemento, los restantes se recorren una posicin hacia adelante en el arreglo, de tal manera que el frente de la fila siempre est dado por la primera posicin del arreglo.

As, nicamente se requiere un apuntador que indique donde se encuentra el final de la fila. Aunque esta es una representacin sencilla que facilita la implantacin de las operaciones, tambin es evidente que una gran desventaja se da con el corrimiento de los elementos cada vez que se saca uno de la fila, lo que repercute en la eficiencia, cuando la fila guarda una cantidad significativa de datos.

Forma 2: arreglo lineal con dos apuntadores Se puede hacer una variante de la forma anterior de representar la fila en un arreglo unidimensional, pero con dos apuntadores: uno para el frente y otro para el final. En esta representacin los elementos no se recorren cada vez que se saca un elemento de la fila, sino que el apuntador al frente se mueve hacia adelante en el arreglo, cada vez que se saca un dato.

As, esta representacin elimina el problema de los corrimientos, pero podra llegar al caso extremo en que se desperdicien localidades de memoria, pues cuando el indicador del final de la fila est en la posicin mxima del arreglo, ya no podrn agregarse elementos a la fila, aunque se tengan lugares disponibles.

Forma 3: arreglo circular con dos apuntadores Una tercera representacin para una fila puede hacerse utilizando un arreglo unidimensional donde los elementos se incorporan de manera que, al sacar uno, no es necesario recorrer los restantes en la fila y cuando el final de la fila est en la posicin mxima del arreglo y ste an tenga localidades, pueda agregarse un nuevo elemento a la fila.

Esto se logra manteniendo dos apuntadores: uno para el frente y otro para el final, y tomando en cuenta que despus de la posicin mxima del arreglo sigue la primera posicin es decir el arreglo se comporta como un anillo o en forma circular. Por ejemplo, para el caso que se muestra en la figura, el ltimo elemento insertado en la fila es la T, y el primer elemento que entr (o el siguiente en salir) es la Y.

Cola o fila en arreglo circular

Es importante observar que esta representacin no tiene las desventajas de las anteriores, pues no se requiere recorrer datos ni se desperdicia espacio en el arreglo al considerar todas las localidades disponibles en l Sin embargo, puesto que un arreglo en la memoria no es fsica-mente circular el implementador de las operaciones tendr que controlar esta caracterstica.

Antes de conocer el cdigo de implementacin para esta representacin, es importante considerar que los dos apuntadores (frente y final) siempre se incrementarn dentro del arreglo. Esto quiere decir que, para agregar un dato, se incrementa el final, y para sacar, se incrementa el frente.

Vale la pena presentar un truco de programacin que permite hacer ms eficiente la accin de "incrementar circularmente". Esto se logra con el operador que permite obtener el residuo de una divisin entera. Para el caso del lenguaje C++ (o C), la equivalencia sera la de la figura, y se puede comprobar (donde MAX es el tamao del arreglo):

Por lo tanto, la implementacin final del TDA fila, con esta representacin y con el diseo lgico 1, sera la siguiente:

Implementacin utilizando memoria dinmica Al igual que en el caso de la pila, se utilizar una lista encadenada en la que cada nodo de la lista guarde un dato de la fila. Sin embargo, a diferencia de la pila, se requiere tener dos apuntadores en ambos extremos de la lista para accesar a ellos: uno para el frente y otro para el final como indica la figura:

Tambin es importante analizar en qu orden estarn estos apuntadores: frente est al inicio de la lista y final en el ltimo nodo? o final en el primer nodo y frente en el ltimo?. Aunque podra parecer indistinto esto repercute en la eficiencia de las operaciones Por la forma en que se construye la lista lo ms conveniente ser que el frente est al inicio de la lista y final en el ltimo nodo.

La implementacin con esta representacin y en el diseo 2 del TDA fila:

EJERCICIOS CAPTULO VI 1. Para cada una de las siguientes formas de representacin fsica de una pila, implemente las operaciones segn la especificacin lgica del diseo 1 para el TDA pila, suponiendo que cada operacin ser un mtodo de la clase que representa a las pilas.

a) Memoria esttica: se utiliza un arreglo unidimensional y un apuntador TOPE que indique el lugar del arreglo donde estar el siguiente elemento por aadir en la pila. Los elementos se guardan desde la primera posicin hasta la ltima del arreglo.

b) Memoria esttica: se utiliza un arreglo unidimensional y un apuntador TOPE que indique la posicin del ltimo elemento aadido a la pila. Los elementos se guardan comenzando en la ltima posicin hasta la primera del arreglo.

c) Memoria esttica: se utiliza un arreglo unidimensional en que la primera posicin indicar dnde estar el siguiente elemento por aadir en la pila. Los elementos se guardan desde la segunda posicin del arreglo hasta la ltima. Obviamente, esta representacin slo sirve para pilas que guardan nmeros enteros.

d) Memoria dinmica: se utiliza una lista encadenada circular con un apuntador externo. El tope de la pila estar en el siguiente nodo del nodo sealado por el apuntador externo. e) Memoria dinmica: se utiliza una lista encadenada circular con un apuntador externo. Aunque no es lo ms eficiente, el tope de la pila estar en el nodo sealado por el apuntador externo.

f) Memoria dinmica: se utiliza una lista doblemente encadenada con un apuntador externo, que hace referencia al ltimo nodo de la lista. El tope de la pila estar en el nodo sealado por el apuntador externo. g) Memoria dinmica: se utiliza una lista doblemente encadenada circular con un apuntador externo. El tope de la pila estar en el nodo sealado por el apuntador externo.

h) Memoria dinmica: se utiliza una lista doblemente encadenada circular con un apuntador externo. El tope de la pila estar en el nodo anterior al nodo sealado por el apuntador externo.

Potrebbero piacerti anche