Você está na página 1de 13

ESTRUCTURA DE DATOS . Referencia prctica con orientacin a objetos. R. Martinez y E.

Quiroga - 2002

Ctedra: Estructuras de Datos Libro: ESTRUCTURA DE D ATOS. Referencia prctica con orientacin a objetos. Romn Martnez, Elda Quiroga Inst. Tecnolgico y de Estudios Superiores de Monterrey. Campus Monterrey. Ed. Thomsan Learning. - 2002 - ISBN 970-686-044-4 Bibliografa de la clases 7 y 8 Unidad 2: Estructuras de Datos Lineales

Capitulo 6 Pilas y Filas (Colas)


OBJETIVOS
Explicar en qu consisten las estructuras de datos pila y fila (Cola), y cules son sus aplicaciones principales. Disear los TDA pila y fila. Describir las diferentes opciones para representar los TDA pila y fila, analizando ventajas y desventajas. Conocer la forma en que se maneja un arreglo circular y cmo se aplica en la representacin de una fila. 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 cuajes pueden obtenerse (uno a la vez) siguiendo un orden especial; el ltimo que entr en la pila es el primero en salir (figura 6.1). 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.

Figura 6.1

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 slo lado de la estructura siguiendo un sistema UEPS (ltimo en Entrar, Primero en Salir) o en ingls LIFO (Last lnput, First
Output).

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.

Captulo 6 Pilas y Filas (Colas)

ESTRUCTURA DE DATOS . Referencia prctica con orientacin a objetos. R. Martinez y E.Quiroga - 2002

Qu es una fila (cola)?


Diariamente vivimos las filas. En los supermercados, en los teatros, en los bancos, hacemos filas con otras personas que esperan ser atendidas (figura 6.2). 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 breve explicacin del concepto de fila o cola (queue en ingls) desde el punto de vista de las estructuras de datos.

Figura 6.2

Qu es la estructura de datos fila?


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 (PEPS) primero en entrar, primero en salir o en ingls FIFO (First lnput, Fi rst Ouput ). 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 llego. Todo esto ndica que los elementos se extraen por el frente de la fila y se agregan por el final.

Cul es la relacin entre pilas y filas?


Se puede observar, con base en lo explicado, que ambas estructuras comparten muchas caractersticas, pero, en particular, ambas son estructuras tiles cuando se requiere administrar el orden de entrada de l os 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, hemos decidido explicar paralelamente estas estructuras de datos.

Cules son las aplicaciones de las pilas y filas?


Cualquier aplicacin que requiera administrar el orden de entrada de un conjunto de datos requerir alguna de estas estructuras. Una pila ser til cuando la aplicacin requiera de un orden inverso al orden de entrada original de los datos. Un ejemplo tpico del uso de una pila lo podernos ver en el manejo de las llamadas a mdulos o subrutinas en un programa (razn por la que un stack 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 fila 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.

Captulo 6 Pilas y Filas (Colas)

ESTRUCTURA DE DATOS . Referencia prctica con orientacin a objetos. R. Martinez y E.Quiroga - 2002

Cul es la especificacin lgica para los TDA pila y fila?


Para ambas estructuras se pueden generalizar los siguientes datos de la especificacin lgica
ELEMENTOS: el tipo de los elementos depende de la aplicacin de la pila o la fila. ESTRUCTURA: lineal DOMINIO: la pila o la fila tendr capacidad almacenar cualquier cantidad de elementos, segn su representacin lo permita.

El diseo de las operaciones es lo que realmente distingue a los TDA pila y fila. Sin embargo, las operaciones que se disearn sern las mismas para ambos. Adicionalmente, se podr observar que puede haber diversos di seos para las operaciones, dependiendo del enfoque del diseador lgico. En este caso, se presentan dos opciones de diseo que permiten ejemplificar y razonar el impacto en la abstraccin de datos.
Diseo 1 para las operaciones del TDA pila METER (PUSH) UTILIDAD: agrega un elemento a una pila. ENTRADAS: la pila a la que se va a agregar el elemento y el elemento que se agregar. SALIDAS: la pila con un elemento ms. PRECONDICIN: la pila est creada y no est llena. POSTCONDICIN: la pila queda con un elemento adicional, agregado por el extremo del tope de la pila. SACAR (POP) UTILIDAD: elimina el ltimo elemento que se agreg a la pila. ENTRADAS: la pila a la que se va a quitar un elemento. SALIDAS: la pila con un elemento menos y el elemento que se elimin. PRECONDICIN: la pila est creada y no est vaca. POSTCONDICIN: la pila queda con un elemento menos, eliminado por el extremo del tope de la pila.

Ya que en estas operaciones se ha puesto como precondicin la verificacin del estado de pila (vaca o llena), es necesario disear operaciones que permitan al usuario de la pila hacer validaciones. Por lo tanto se disean estas operaciones.
VACA UTILIDAD: verifica si una determinada pila est vaca o no. ENTRADAS: la pila que se va a verificar. SALIDAS: valor booleano que indique si la pila est vaca o no. PRECONDICIN: la pila por verificar existe. POSTCONDICIN: ninguna, la estructura no se modifica LLENA UTILIDAD: verifica si una pila determinada se encuentra llena o no ENTRADAS: la pila que se va a verificar. SALIDAS: valor booleano que indique si la pila est llena o no, PRECONDICIN: la pila por verificar existe. POSTCONDICIN: ninguna, la estructura no se modifica.

Si se analiza un poco, 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.
Diseo 1 para las operaciones del TDA fila METER (INSERT) UTILIDAD: agrega un elemento a una fila. ENTRADAS: la fila a la que se agregar el elemento y el elemento por agregar. SALIDAS: la fila con un elemento adicional. PRECONDICION: la fila est creada y no est llena. POSTCONDICION: la fila queda con un elemento adicional, agregado por el extremo del final de la fila. SACAR (REMOVE) UTILIDAD: elimina el ltimo elemento que se agreg a una fila. ENTRADAS: la fila a la que se va a quitar un elemento. SALIDAS: la fila con un elemento menos y el elemento que se elimin. PRECONDICION: la fila est creada y no est vaca. POSTCONDICION: la fila queda con un elemento menos, eliminado por el extremo del frente de la fila.

Captulo 6 Pilas y Filas (Colas)

ESTRUCTURA DE DATOS . Referencia prctica con orientacin a objetos. R. Martinez y E.Quiroga - 2002

VACA UTILIDAD: verifica si una determinada fila se encuentra vaca o no. ENTRADAS: la fila que se va a verificar SALIDAS: valor booleano que indique si la fila est vaca o no. PRECONDICION: la fila por verificar existe. POSTCONDICION: ninguna, la estructura no se modifica. LLENA UTILIDAD: verifico si una fila determinada se encuentra llena o no. ENTRADAS: la fila que se va a verificar. SALIDAS: valor booleano que indique si la fila est llena o no. PRECONDICION: la fila por verificar existe. POSTCONDICION: ninguna, la estructura no se modifica.

Es importante darse cuenta en este momento que, sin saber cmo se implementar fsicamente la pila o la fila, se pueden disear las operaciones en un nivel abstracto. Adelantando un poco 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:
class Pila { private: // atributos segn representacin fsica del TDA public: Pila(); // constructor que inicializa como vaca void Meter (Tipoelem dato); Tipeelem Sacar(); char Llenar(); char Vacia(); ~Pila(); // destructor si se requiere };

Ahora bien, si se eliminan las precondicioncs que indican que las estructuras no deben estar vacas o llenas, estas 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 VACIA. A continuacin se detalla este diseo slo para el TDA pila, del cual se deduce fcilmente el TDA fila.
Diseo 2 para las operaciones del TDA pila METER (PUSH) UTILIDAD: agrega un elemento a una pila si no est llena. ENTRADAS: la pila a la que se va a agregar el elemento y el elemento que se agregar. SALIDAS: la pila con un elemento adicional, si se pudo agregar, o la pila como estaba. Adems, la operacin genera como salida un valor booleano que indica si se pudo o no agregar el elemento, PRECONDICION: ninguna. POSTCONDICION: la pila queda con un elemento adicional por el extremo del tope si se pudo agregar o se queda como estaba por encontrarte llena. SACAR (POP) UTILIDAD: elimina el ltimo elemento que se agreg a una pila, si es que no esta vaca. ENTRADAS: la pila a la que se va a quitar un elemento. SALIDAS: la pila con un elemento menos, si se pudo quitar y el elemento eliminado o la pila como estaba. Adems, la operacin que se realiza genera como salida un valor booleano que indica si se pudo o no eliminar el elemento. PRECONDICION: ninguna. POSTCONDICION: la pila queda con un elemento menos, si se pudo quitar (eliminado por el tope) o queda como estaba en caso de encontrarse vaca.

Captulo 6 Pilas y Filas (Colas)

ESTRUCTURA DE DATOS . Referencia prctica con orientacin a objetos. R. Martinez y E.Quiroga - 2002

Ejemplo
Caso de aplicacin
Este es el momento para ilustrar el concepto y los beneficios de la abstraccin de datos, en la que se debe cumplir la independencia entre los niveles de aplicacin e implantacin (fsico). El problema consiste en verificar si una frase es o no palndromo, esto es, si se lee igual de izquierda a derecha, quede derecha a izquierda. Por ejemplo: ANITALAVALATINA. Aunque la solucin de este problema puede obtenerse de muchas maneras, se puede observar que una pila y una fila pueden ser tiles planteando el siguiente algoritmo: 1. Cada letra que se lea de la frase se deber meter en una pila y en una fila. 2. Saque un dato de la pila y de la fila. Si son iguales, repita el paso 2. Si son diferentes, termine el proceso indicando que no es palndromo. 3. Si la pila y la lila se vaciaron, es palndromo. 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++:
Implementacin parcial del TDA Pila, segn el diseo lgico 2 class Pila { private: // atributos segn // representacin del TDA public: Pila(); // constructor que // inicializa como vaca char Meter(Tipoelem dato); char Sacar(Tipoelem* dato); ~Pila(); // destructor }; Implementacin parcial del TDA Fila, segn el diseo lgico 1 class Fila { private: // atributos segn // representacin del TDA public: Fila(); // constructor que // inicializa como vaca void Meter (Tipoelem dato); Tipeelem Sacar(); char Llenar(); char Vacia(); ~Fila(); // destructor };

La implementacin de la aplicacin se puede realizar de la siguiente manera, sin necesidad de conocer cmo estn implement ados los TDA, lo que cumple con la independencia de niveles durante la abstraccin de datos:
char palindrome() { Pila P; Fila F; Tipoelem dato; // define F como referencia a un objeto de tipo Pila // define F como referencia a un objeto de tipo Fila // definicin del tipo de datos del carcter de la frase

cin.get(dato) //ingreso por consola del 1er carcter de la frase While (dato != \n) // Mientras el recorrido de la frase no termine, hace: { P.Meter(dato) // Inserta carcter de frase en Pila F.Meter(dato) // Inserta carcter de frase en Fila cin.get(dato); } // Ingresa por consola del siguiente carcter de la frase While (P.sacar(dato)) // if (F.sacar()!= dato) return 0; return 1; // }; Mientras existan elementos para sacar en la Pila, hacer: // Si el elemento sacado de la Pila NO es igual al // elemento sacado de la Fila retornar 0=Fracaso Si ya no retorno 0=fracaso, retornar 1=xito.

Cmo se puede representar fsicamente el TDA pila


Las herramientas que se han presentado en los captulos anteriores nos permiten observar que la representacin para una pila se puede hacer con las estructuras lineales tpicas de un lenguaje de programacin. En este caso, es indispensable distinguir entre la opcin de utilizar memoria esttica a travs de un arreglo unidirnensional, o bien de utilizar memoria dinmica 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
Captulo 6 Pilas y Filas (Colas) 5

ESTRUCTURA DE DATOS . Referencia prctica con orientacin a objetos. R. Martinez y E.Quiroga - 2002

ejemplificaremos las dos situaciones ms tpicas de implementacin y se dejarn como ejercicio otras posibilidades.

Implementacin utilizando memoria esttica


Se utilizar un arreglo unidimensiottal 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 a adido). Estos datos se pueden encapsular como atributos de un objeto en caso de que se est utilizando un lenguaje corno C++, quedando de la siguiente manera la definicin de la clase, segn el diseo lgico 2:
class Pila { private: Tipoelem datos[MAX] // arreglo para guardar los datos int tope; // apuntador al ltimo dato aadido public: Pila(); // constructor que inicializa como vaca char Meter(Tipoelem dato); char Sacar(Tipoelem* dato); // NO se requiere destructor };

Las operaciones se implementarn de la siguiente manera:


Pila::Pila() { tope = -1; } // este valor indica que no hay datos en la Pila char Pila::Meter(tipoelem nuevo) { if (tope == MAX - 1) // si el apuntador est en la ltima posicin, // ya no hay tamao return 0; else { tope++; // se apunta al nuevo lugar disponible del arreglo datos[tope]=nuevo; // y se copia el nuevo dato return l; } } char Pila::Sacar(tipoelem & valor) { if (tope == -1) // si el apuntador est en 1 la pila est vaca return 0; else { valor = datos[tope]; tope--; // aunque el valor queda en el arreglo lgicamente // no est en la pila, y su lugar puede ser ocupado nuevamente return l; } }

Implementacin utilizando memoria dinmica


Se utilizar una lista encadenada en la que se guardarn los datos de 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:
class Pila { private: Nodo *tope // el apuntador externo manejar el tope public: Pila(); // constructor que inicializa como vaca char Meter(Tipoelem dato); char Sacar(Tipoelem& dato); ~Pila() // Destructor necesario };

Captulo 6 Pilas y Filas (Colas)

ESTRUCTURA DE DATOS . Referencia prctica con orientacin a objetos. R. Martinez y E.Quiroga - 2002

Las operaciones se implementaran de la siguiente manera:


Pila::Pila() {tope = NULL; } Pila::~Pila() { Nodo *aux; aux = tope; while (tope != NULL) { tope = aux->sig; delete aux; aux = tope; } } char Pila::Meter (tipoelem nuevo) { Nodo *aux = new Nodo; if(aux == NULL) return 0; else { aux->info = nuevo; aux->sig = tope; tope = aux; return 1; } } char Pila::Sacar (tipoelem &valor) { Nodo *aux = tope: if(aux == NULL) return 0; else { valor = aux->info; tope = aux->sig; delete aux; return 1;} }

Cmo se puede representar fsicamente el TDA fila?


Al igual que en la pila, resulta evidente imaginar la representacin de la fila por medio de l as 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 l os 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
Captulo 6 Pilas y Filas (Colas) 7

ESTRUCTURA DE DATOS . Referencia prctica con orientacin a objetos. R. Martinez y E.Quiroga - 2002

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 6.3, el ltimo elemento insertado en la fila es la T, y el primer elemento que entr (o el siguiente en salir) es la Y.

Figura 6.3. 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 desperdi cia espacio en el arreglo al considerar todas las localidades disponibles en l. Sin embargo, puesto que un arreglo en la memoria no es fsicamente 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. En la accin de incrementar se tendr que considerar la circularidad del ar reglo y se puede deducir que el incremento se validar con una estructura de decisin que verifique si se est en la ltima posicin del arreglo para mandar a la posicin inicial, o si no, incrementar normalmente. Sin embargo, aqu 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 6.4, y se puede comprobar (donde MAX es el tamao del arreglo):
if (ap == MAX-1) ap = 0; else ap++;
Figura 64.

ap = [ap+1] % MAX;

Por lo tanto, la implementacin final del TDA fila, con esta representacin y con el diseo lgico 1, sera la siguiente:
class Fila { private: tipoelem datos[MAX]; int Frente, Final; public: Fila() {Frente = Final = 1:} void Meter(tipoelem dato); tipoelem Sacar (); char Llena(); char Vacia(); };

Captulo 6 Pilas y Filas (Colas)

ESTRUCTURA DE DATOS . Referencia prctica con orientacin a objetos. R. Martinez y E.Quiroga - 2002

void Fila::Meter(tipoelem nuevo) { Final = (Final + 1) % MAX; datos[Final] = nuevo; if(Frente == 1) Frente = 0; } tipoelem Fila::Sacar() { tipoelem valor = datos[Frente]; if(Frente == Final) Frente = Final = 1; else Frente = (Frente + 1) % MAX; return valor; } char Vacia ( ) { return (Frente == 1); } char Llena ( ) { return ((Final + 1) % MAX) == Frente ); }

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 (figura 6.5). Tambin e s 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
frente final

... Figura 6.5.

A continuacin, se muestra la implementacin con esta representacin y en el diseo 2 del TDA fila:
class Fila ( private: Nodo *Frente, *Final: public: Fila(); // constructor que inicializa como vaca char Meter(tipoelem dato); char Sacar (tipoelem* dato); ~Fila(); // destructor necesario }; Fila::Fila() { Frente = Final = NULL; } Fila::~Fila() { Nodo *aux = Frente; while (Frente != NULL) { Frente = aux->sig: delete aux; ata = Frente; } }

Captulo 6 Pilas y Filas (Colas)

ESTRUCTURA DE DATOS . Referencia prctica con orientacin a objetos. R. Martinez y E.Quiroga - 2002

char Fila::Meter(tipoelem nuevo) { Nodo *aux = new Nodo: if (aux == NULL) return 0; else { aux->info = nuevo; if (Final == NULL) Frente == aux: else Final->sig = aux; Final = aux; return 1; } } char Fila::Sacar(tipoelem * valor) { Nodo *aux = Frente; if(aux == NULL) return 0; else { valor = aux->info; Frente = aux->sig; delete aux; if(Frente == NULL) Final = NULL; return 1; } }

Ejercicios
1. Para cada una de las siguientes formas de representacin fsica de una pila, impleme nte 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 po sicin 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 e lemento 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. 2. Resuelva los mismos casos del ejercicio anterior, pero basndose en la especificacin lgica del diseo 2 del TDA pila. 3. Un nuevo diseo de las operaciones en la especificacin lgica del TDA pila se muestra a continuacin:
METER --> igual al diseo 2 SACAR ENTRADA: la pila de donde se desea sacar SALIDA: la pila modificada PRECONDICIN: la pila existe y no est vaca POSTCONDICION: la pila tiene un elemento menos eliminado por el extremo del tope

Captulo 6 Pilas y Filas (Colas)

10

ESTRUCTURA DE DATOS . Referencia prctica con orientacin a objetos. R. Martinez y E.Quiroga - 2002

OBSERVA ENTRADA: la pila de donde se desea observar SALIDA: el valor del elemento que est en el tope de la pila PRECONDICION: la pila existe y no est vaca POSTCONDICION: ninguna VACIA --> igual al diseo 1

Con estas especificaciones, responda los siguientes incisos: a) Por qu se justifica el diseo de la operacin OBSERVA y VACA?, qu ventajas se tienen en el nivel de aplicacin?, por qu no se justifica el diseo de la operacin LLENA (igual al diseo 1)? b) Implemente las operaciones del nuevo diseo (SACAR y OBSERVA) en cada una de las formas de representacin que se indicaron en el ejercicio 1. c) Resuelva el problema del palndromo, en el nivel de aplicacin, utilizando ahora este diseo lgico. d) Suponiendo que la operacin OBSERVA se aade al diseo 1 y al diseo 2, cmo sera su implementacin en cada diseo, considerando que se implementar al nivel de aplicacin del resto de las operaciones del TDA pila? 4. A continuacin se muestra una serie de casos los cuales debern resolverse implementando una funcin libre en C++ en el nivel de aplicacin del TIJA pila, segn el diseo 2: a) Realice un mdulo que sirva para invertir el orden de los elementos de una pila. b) Desarrolle un mdulo que sirva para obtener una copia de una pila. c) Realice un mdulo que sirva para contar cuntos elementos tiene una pila. d) Obtenga un mdulo que sirva para sacar el elemento del fondo de una pila. e)Realice un mdulo que sirva para reemplazar por un nuevo valor las ocurrencias de cierto valor en una pila. 5. Cmo se podran implementar dos pilas en un mismo arreglo? Si se supone que una pila crecer de la primera posicin hacia adelante, y que otra crecer de la ltima posicin hacia atrs en el arreglo, y que cada una tiene un apuntador (TOPE1 y TOPE2) que indica la posicin del ltimo elemento aadido en cada pila, cul es la condicin para detectar que las pilas estn llenas? Implemente las operaciones de METER y SACAR para cada una de las pilas, segn el diseo lgico 2. 6. Una nueva representacin en memoria esttica para el TDA fila, se describe a continuacin: Se utiliza un arreglo unidimensional en forma circular, con un apuntador al frente y otro al final de la fila. La fila crece, a partir de la primera posicin del arreglo, en forma circular. El apuntador FINAL sealar el ltimo elemento aadido y el apuntador FRENTE siempre apuntar a un lugar reservado, que nunca guardar un elemento, pero siempre estar una posicin antes del siguiente elemento en salir de la fila. Con esta representacin, implemente las operaciones del TDA fila, segn el diseo lgico 2. Qu ventajas se obtienen con respecto a la representacin en que no se utilizaba el lugar reservado? 7. Para cada una de las siguientes formas de representacin fsica de una fila en memoria dinmica implemente las operaciones segn la especificacin lgica del diseo 2 para el TDA fila, suponiendo que cada operacin ser un mtodo de la clase que representa a las filas. a) Lista encadenada circular, donde el apuntador externo de la lista seala el final de la fila, y el siguiente nodo del que representa el final es el frente. b) Lista doblemente encadenada con dos apuntadores externos, uno al primer nodo en la lista y otro al ltimo. El frente de la fila ser el ltimo nodo de la lista: el final de la fila ser el primer nodo. c) Lista doblemente encadenada circular con un apuntador externo que seala el final de la fila y el nodo anterior representa el frente. d) Lista doblemente encadenada circular con un apuntador externo que seala el frente de la fila, y el nodo siguiente representa el final. 8. Suponga que la operacin OBSERVA, que se dise en el ejercicio 3, tambin es til para el TDA fila, y se aade al diseo 1 y al 2. Cmo sera su implementacin en cada diseo, considerando que se implementar en el nivel de aplicacin del resto de las operaciones del TDA fila?
Captulo 6 Pilas y Filas (Colas) 11

ESTRUCTURA DE DATOS . Referencia prctica con orientacin a objetos. R. Martinez y E.Quiroga - 2002

9. A continuacin se muestra una serie de casos que debern resolver, se implementando una funcin libre en C++ y trabajando en eL nivel de aplicacin del TDA fila segn el diseo 2. a) Realice un mdulo que sirva para copiar una fila. b) Obtenga un mdulo que sirva para contar los elementos de una fila. c) Realice un mdulo que sirva para reemplazar las ocurrencias de cierto valor, en una fila, por un nuevo valor. d) Desarrolle un mdulo que sirva para reorganizar los valores guardados en una fila de nmeros, de tal forma que primero queden los valores negativos (en el orden que haban llegado a la fila) y despus los positivos (en el mismo orden). 10. Cmo se podran implementar dos filas en un mismo arreglo? Suponiendo que una fila crecer de la primera posicin hacia adelante, que la otra fila crecer de la ltima posicin hacia atrs en el arreglo cada una tiene un apuntador (FINAL1 y FINAL2) que indica la posicin del ltimo elemento aadido en cada fila y que el frente de las filas siempre estar en la primera y ltima posicin del arreglo, cul es la condicin para detectar que las filas estn llenas? lmplemente las operaciones de METER y SACAR para cada una de las filas, segn el diseo lgico 2. 11. A continuacin se muestra el estado de una lista encadenada circular en memoria esttica, controlada por el apuntador externo llamado LISTA. Los espacios disponibles en el arreglo se controlan por medio de otra lista encadenada (no circular), manejada como pila, a travs del apuntador externo llamado DISPONIBLES. El valor NULL se representa por el 0 (cero)
[1] [2] [3] [4] [5] [6] [7] [8] CESAR
FRANCISCO

MANUEL

7 3 5 1 6 0 4 2 Lista = 4 Disponibles = 8

Para los incisos siguientes, muestre el estado del arreglo y de los apuntadores, despus de ejecutar la operacin correspondiente. Maneje las operaciones de filas y pilas sobre una lista circular de la manera ms eficiente (evitando recorrer nodos). Para el primer inciso, tome el estado original del arreglo; para los otros incisos, el estado del arreglo resultante del inciso anterior. a) Inserte el dato DANIEL en la lista, considerando que es la representacin de una pila. b) Inserte el dato MARA en la lista, considerando que es la representacin de una fila. c) Saque un dato de la lista, considerando que es la representacin de una pila. d) Saque un dato de la lista, considerando que es la representacin de una fila. 12. Repita el ejercicio anterior conside rando que la lista es doblemente encadenada circular, y que la lista de disponibles sigue manejndose igual (como pila) slo a travs del campo SIG. Considere que para la pila el tope es el nodo apuntado por LISTA, y que para la fila el frente es el nodo sealado por LISTA y el final es el nodo anterior a] apuntado por LISTA. 13. Cmo se puede implementar una fila al nivel de aplicacin de las pilas? Considere que la definicin de la clase fila es:
class Fila { private: Pila datos; public: // mtodos tradicionales, segn el diseo lgico };

Esto significa que tendr que simularse una fila por medio de una pila y que la implementacin de los mtodos de la clase fila se realizar en el nivel de aplicacin de las pilas.
Captulo 6 Pilas y Filas (Colas) 12

ESTRUCTURA DE DATOS . Referencia prctica con orientacin a objetos. R. Martinez y E.Quiroga - 2002

Escriba la implementacin de los mtodos de la clase fila, considerando esta representacin y el diseo lgico 2. 14. Cmo se puede implementar una pila al nivel de aplicacin de las filas? Realice lo equivalente al ejercicio anterior, pero ahora considere que se implementar una pila utilizando el nivel de aplicacin de las filas.

AUTOEVALUACIN
1. Se implemento una fila en un arreglo de cinco posiciones utilizan do dos apuntadores (FRENTE y FINAL) y Considerando que el arreglo es circular. Suponiendo que el arreglo se define con los subndices 1 a 5, y que FRENTE apunta al siguiente elemento en salir y FINAL apunta al ltimo elemento aadido, cul es el estado de la fila si el apuntador FRENTE vale 4 y el FINAL vale 3? a) La fila est llena b) La fila est vaca c) La fila tiene dos elementos d) La fila tiene un elemento e) La fila tiene tres elementos 2. La operacin OBSERVA se dise para el TDA pila de la siguiente forma: Entrada: la pila de donde se desea observar Salida: el valor prximo a sacar de la pila Precondicin: la estructura de datos est creada y tiene elementos Postcondicin: ninguna Suponiendo que la operacin se implant como un mtodo para la clase pila de la siguiente forma:
Tipoelem Observa () {return datos[tope+1];}

se puede decir que: a) La pila est implementada en un arreglo en que el apuntador TOPE seala al ltimo elemento aadido y donde la pila crece a partir de la primera posicin. b) La pila est implementada en un arreglo en que el apuntador TOPE seala al ltimo elemento aadido y donde la pila crece a partir de la ltima posicin. c) La pila est implementada en un arreglo en que el apuntador TOPE seala al siguiente lugar disponible en el arreglo y donde la pila crece a partir de la primera posicin. d) La pila est implementada en un arreglo en que el apuntador TOPE seala al siguiente lugar disponible en el arreglo y donde la pila crece a partir de la ltima posicin. e) Ninguna de las anteriores. 3. Dada la siguiente lista encadenada circular:
Lista

...

cul de los siguientes enunciados es verdadero, suponiendo que se ha representado una pila o una fila en esta lista de la manera ms eficiente? a) Para una pila, el dato M es el siguiente elemento en salir b) Para una fila, el dato M es el siguiente elemento en salir. c) Para una pila, el dato R ser el ltimo elemento en salir. d) Para una fila, el dato M ser el ltimo elemento en salir e) Para una fila, el dato R es el ltimo dato que entr.

Captulo 6 Pilas y Filas (Colas)

13

Você também pode gostar