Está en la página 1de 5

Estructuras de datos

Pilas y colas

Introducción
Los arreglos ciertamente son estructuras de datos que podríamos llamar lineales. Es decir, cada
componente tiene un único sucesor y un único predecesor con excepción del primero y del último
respectivamente. Por otra parte, las operaciones de inserción y eliminación pueden realizarse en
cualquier posición de nuestro arreglo. Cabe señalar, sin embargo, que existen problemas que por su
naturaleza requieren que los elementos se agreguen o se quiten sólo por un extremo. Las pilas y colas
también son estructuras de datos lineales, pero con restricciones en cuanto a la posición en la cual se
pueden llevar a cabo las operaciones de inserción y eliminación de componentes.

Pilas

Una pila representa una estructura lineal de datos en la que se puede agregar o quitar
elementos únicamente por uno de los dos extremos. En consecuencia, los elementos de una pila se
eliminan en orden inverso al que se insertaron; es decir, el último elemento que se mete en la pila es el
primero que se saca. Debido a esta característica, se le conoce como una estructura LIFO (Last-Input,
First-Output: el último en entrar es el primero en salir).
Existen numerosos casos prácticos en los que se utiliza el concepto de pila; por ejemplo, una pila de
platos, una pila de latas en un supermercado, una pila de libros que se exhiben en una librería, etc. Por
ejemplo, digamos que un cocinero tiene junto a él una pila de platos; si el cocinero necesita un plato,
¿Cuál plato va a tomar? Sin duda, por razones prácticas y por ser la alternativa más óptima, el cocinero
tomará el que está encima de todos, que es el último que se colocó en la pila.

Una pila se define formalmente como una colección de datos a los cuales se puede acceder mediante
un extremo, que se conoce generalmente como tope.

Las pilas son estructuras de datos lineales, como los arreglos, ya que los componentes ocupan
lugares sucesivos en la estructura y cada uno de ellos tiene un único sucesor y un único
predecesor, con excepción del último y el primero respectivamente.
Las pilas no son estructuras fundamentales de datos; es decir, su uso y diseño no está (o no estaba)
definido formalmente como tal en los lenguajes de programación. Para su representación se requería el
uso de estructuras de datos tales como: Arreglos y listas. Sin embargo, Java permite el manejo de pilas
mediante la clase Stack, que permite la manipulación directa de pilas sin la necesidad de hacer “pasos
adicionales” para su creación.
Al utilizar arreglos para implementar pilas se tiene la limitación de que se debe reservar espacio de
memoria con anticipación, característica propia de los arreglos. Una vez dado un máximo de capacidad
a la pila, no es posible insertar un número de elementos mayor al máximo establecido. Si la pila estuviera
llena y se intentará insertar un nuevo elemento, se producirá un error conocido como desbordamiento
de la pila (Stackoverflow).
Una posible solución a este tipo de inconvenientes consiste en definir pilas de gran tamaño, pero esto
último resultaría ineficiente y costoso si sólo se utilizarán algunos elementos. No siempre es viable saber
con exactitud cuál es el número de elementos a tratar; por tanto, siempre existe la posibilidad de
cometer un error de desbordamiento o bien de hacer uso ineficiente de la memoria.

Operaciones con pilas


La definición de una estructura de datos queda completa al incluir las operaciones que se pueden realizar
en ella. Para el caso de las pilas, las operaciones básicas que se pueden llevar a cabo son:
• Insertar un elemento – Push – en la pila.
• Eliminar un elemento – Pop – en la pila.
A continuación, un ejemplo para ilustrar el funcionamiento de las operaciones de inserción y eliminación
de pilas.

Ejemplo de operaciones con pilas


Si se insertasen los elementos: lunes, martes, miércoles, jueves y viernes en una PILA, la estructura
quedaría tal y cómo se muestra en la ilustración 1a. Ahora bien, si se eliminara el elemento viernes, el
Tope (el último elemento de la pila) de la pila apuntaría ahora a jueves 1b.

PILA PILA

Tope -> Viernes

Jueves Tope -> Jueves

Miércoles Miércoles

Martes Martes

Lunes Lunes
a) b)

Ilustración 1: Insercion y eliminación en pilas.


Si en algún momento se quisiera eliminar al elemento martes, esto no sería posible ya que sólo se
puede tener acceso al elemento que se encuentra en la cima de la pila.
Una forma de resolver este problema es eliminar primeramente los elementos jueves y miércoles, de
esta manera martes quedaría ubicado en la cima de la PILA y ahora sería posible extraerlo (Ilustración
2).

PILA PILA PILA

Tope -> Miércoles

Martes Tope -> Martes

Lunes Lunes Tope -> Lunes


a) b) c)

Ilustración 2: Inserción y eliminación,


a) Luego de sacar jueves. b) Luego de sacar miércoles. c)Luego de sacar martes.

Aplicaciones de pilas
Las pilas son estructuras de datos muy usadas en la solución de diversos tipos de problemas en el área
de la computación. Ahora se analizarán algunos de los casos más representativos de la aplicación de las
mismas:
• Llamadas a subprogramas.
• Recursividad.
• Tratamiento de expresiones aritméticas.
• Ordenación.
En este documento, explicaremos cómo se aplican las pilas en las llamadas a métodos.

Ejemplo de llamadas a subprogramas o métodos.


Cuando se tiene un programa que llama a un método, internamente se usan pilas para guardar el estado
de las variables del programa, así como las instrucciones pendientes de ejecución en el momento que se
hace la llamada. Cuando termina la ejecución del método, los valores almacenados en la pila se
recuperan para continuar con la ejecución del programa en el punto en el cual fue interrumpido. Además
de las variables se recupera la dirección del programa en la que se hizo la llamada, porque a esa posición
se regresa el control del proceso.
Supongamos, por ejemplo, que se tiene un programa con un método main que llama a los métodos UNO
y DOS. A su vez el método DOS, llama al TRES. Cada vez que la ejecución de uno de los métodos concluye,
se regresa el control al nivel inmediato superior.
Cuando el método main llama al método UNO, se guarda en una pila la posición en la que se hizo la
llamada. Al terminar el método UNO, el control se regresa al programa recuperando la dirección previa
de la pila. Al llamar al método DOS, nuevamente se guarda la dirección de main en la pila. Cuando DOS
llama a TRES, se pone en la pila la dirección de DOS. Después de procesar TRES, se pone en la pila la
dirección de DOS. Después de procesar TRES, se recupera la posición de DOS para continuar con su
ejecución. Al terminar DOS se regresa el control a main, obteniendo previamente la dirección guardada
en la pila.
Finalmente podemos concluir que las pilas son necesarias en este tipo de aplicaciones por lo siguiente:
• Permiten guardar la dirección del programa, o método, desde donde se hizo la llamada a otros
métodos, para regresar posteriormente y seguir ejecutándolo a partir de la instrucción
inmediata a la llamada.
• Permiten guardar el estado de las variables en el momento en que se hace la llamada, para
seguir ocupándolas al regresar del método.

Colas
Caseta
Una cola constituye una estructura lineal de datos en la que los nuevos
elementos se introducen por un extremo y los ya existentes se eliminan por el otro. Es importante señalar
que los componentes de la cola se eliminan en el mismo orden en el cual se insertaron. Es decir, el primer
elemento que se introduce en la estructura será el que se eliminará en primero orden. Debido a esta
característica, las colas también reciben el nombre de estructuras FIFO (First-In, First-Out: el primero en
entrar es el primero en salir).
Existen numerosos casos de la vida real en los cuales se usa este concepto. Por ejemplo, la cola de los
bancos en las que los clientes deben esperar para ser atendidos (la primera persona en la cola será la
primera en recibir el servicio), la cola de los niños que esperan para subir a un juego mecánico, las colas
de los vehículos esperando la luz verde de los semáforos, etcétera.

Representación de las colas


Las colas al igual que las pilas, no existen formalmente como estructuras de datos estándar en los
diversos lenguajes de programación, sin embargo, Java permite la implementación de la interfaz Queue
para manipulación de filas.
De cualquier manera, este tipo de estructura de datos se puede representar mediante el uso de arreglos
o listas.
Cuando las colas se implementan con arreglos unidimensionales, es importante definir un tamaño
máximo para la cola y dos variables auxiliares. Una de estas variables auxiliares será para almacenar la
posición del primer elemento de la cola (FRENTE) y otra para que se guarde la posición del último
elemento de la cola (FINAL). Estas variables no son necesarias de declarar en nuestras implementaciones
en Java, pero los conceptos de FRENTE de la cola y FINAL de la cola siguen vigentes.

Operaciones con colas


La definición de la estructura de datos tipo cola queda completa al incluir las operaciones que se pueden
realizar en ella. Las operaciones básicas que pueden efectuarse son:
• Insertar un elemento en la cola (offer).
• Eliminar un elemento de la cola (poll).
Las inserciones se llevarán a cabo por el FINAL de la cola, mientras que las eliminaciones se harán por el
FRENTE (recuerde que el primero en entrar es el primero en salir).

Ejemplo de operaciones con colas


Retomando el ejemplo anterior usado con las pilas (pila con los días de la semana). Supongamos que se
insertan en COLA los elementos: lunes, martes, miércoles, jueves y viernes (en ese orden).

COLA

FRENTE -> Lunes

Martes

Miércoles

Jueves

FINAL -> Viernes

Ilustración 3: Representación de una cola.

El elemento lunes es el primero que se puede eliminar por ser el primero que se insertó en la cola. Luego
de la eliminación, FRENTE guarda la posición del siguiente elemento. Si ahora se insertara sábado, este
ocuparía ahora la posición siguiente al elemento viernes.

Aplicaciones de las colas


Una aplicación común de las colas se presenta cuando se envía a imprimir algún documento o programa
en las colas de impresión. Cuando hay una sola impresora para atender a varios usuarios, suele suceder
que algunos de ellos soliciten los servicios de impresión al mismo tiempo o mientras el dispositivo esté
ocupado. En estos casos se forma una cola con los trabajos que esperan para ser impresos; estos se
procesarán en el orden en el cual fueron introducidos en la cola.
Otro caso de aplicaciones de colas en computación es el que se presenta en los sistemas de tiempo
compartido. Varios usuarios comparten ciertos recursos, como CPU y memoria de la computadora. Los
recursos se asignan a los procesos que están en cola de espera, suponiendo que todos tienen una misma
prioridad, en el orden en el cual fueron introducidos en la cola.

También podría gustarte