Pilas y Colas

Unidad de Apoyo para el Aprendizaje

Iniciar

Introducción


Tal vez la palabra pila te haga pensar en ese pequeño utensilio de metal y químicos que insertas en ciertos aparatos portátiles y te permite abastecerlos de energía eléctrica para poder utilizarlos. Quizá el término pila te remita al concepto que se acopla exactamente al tema que vamos a abordar, es decir, pensarías en lo que obtienes como resultado de apilar un conjunto de elementos.

Cuando se realiza una pila de algo, los elementos que se van apilando se ponen uno encima del otro, lo que quiere decir que no hay otra forma de agregar un elemento a la pila más que por encima; no por abajo ni en medio y, curiosamente, el único elemento que se pude tomar es el último que se puso en la pila, esto es, el de encima.

Para diferenciar lo que revisaremos en el tema, piensa lo siguiente: ¿qué pasaría si intentas apilar un conjunto de elementos perecederos como las naranjas? Ahora, ¿qué pasaría si al tomar alguna, eligieras siempre la que agregaste al final? Llegará un momento en el que las primeras naranjas que pusiste en la pila se pudrirán.

A diferencia de lo anterior, cuando hablamos de pilas desde el punto de vista de un tipo de dato abstracto (TDA), tenemos que pensar los escenarios en que podríamos utilizar este tipo de dato, ya que puede sernos útil en ciertas circunstancias, pero en otras no, como el ejemplo anterior.

Respecto a las colas, en la vida real existen muchos tipos, por ejemplo, la cola para comprar boletos del metro, para pagar los productos que compramos en el supermercado o, la más conocida, la que hacemos para comprar las tortillas. Si ponemos atención, nos daremos cuenta de que una de las características de las colas es la justicia, en cuanto al momento en que se le despacha o atiende a la persona que está formada, ya que se le va atendiendo como van llegando, no antes, ni después, sino respetando el hecho de haber llegado antes que alguien más, que no será atendido hasta que la persona que llegó antes sea atendida.



Objetos apilados

Pilas



Personas haciendo una fila

Colas



El estudio de este tema te permitirá:

Generar un código de programación a partir del reconocimiento de las características de las pilas y colas, para almacenar y manipular datos de forma estructurada.

Definición del tipo de dato abstracto pila


Una pila (stack) es un tipo especial de lista en la que la inserción y borrado de nuevos elementos se realiza sólo por un extremo que se denomina cima o tope (top).

Una pila es una colección ordenada de elementos, en la cual, en un extremo pueden insertarse o retirarse otros elementos, colocados por la parte superior. Una pila permite la inserción y eliminación de elementos, por lo que realmente es un objeto dinámico que cambia constantemente.



Representación abstracta de una pila

Representación abstracta de una pila



Es importante notar que los elementos que se agregan por un extremo de la lista o arreglo (pensando en un arreglo como una lista de elementos), se sacan por el mismo extremo, es decir, el último elemento que se agrega a la lista es el primer elemento que se puede sacar y ningún otro más, por eso, a este tipo de estructuras se les conoce como LIFO (last-in, first-out o última entrada, primera salida).

Un ejemplo de pila o stack se puede observar en el mismo procesador de un sistema de cómputo, es decir, cada vez que en los programas aparece una llamada a una función, el microprocesador guarda el estado de ciertos registros en un segmento de memoria, conocido como stack segment, mismo que será recuperado al regreso de la función.



Definición de las operaciones sobre pilas

Las operaciones que debe tener una pila se muestran a continuación.







Implementación de una pila


A continuación explicaremos, por medio de imágenes y códigos de programación en Lenguaje C, la forma de implementar una pila con una lista enlazada simple.



Declaración de una pila en Lenguaje C

Cervantes, G. (2017). Declaración de una pila en Lenguaje C [ilustración].



En relación con este código, es importante tomar en cuenta que el inicio de la pila debe ser declarado con un apuntador a nulo, como se verá representado en la siguiente imagen.



Representación de un apuntador a nulo (creación de una pila)

Cervantes, G. (2017). Representación de un apuntador a nulo (creación de una pila) [ilustración].



Por ejemplo, si quisiéramos agregar a la pila el elemento 6 y después el elemento 100, lo declararíamos como se puede apreciar en la siguiente imagen.



Declaración para agregar el elemento 6 y el elemento 100 a una pila en Lenguaje C

Cervantes, G. (2017). Representación de un apuntador a nulo (creación de una pila) [ilustración].Cervantes, G. (2017). Declaración para agregar el elemento 6 y el elemento 100 a una pila en Lenguaje C [ilustración].



La representación de la declaración anterior es la siguiente.



Representación de agregar el elemento 6 y después el 100 a una pila

Cervantes, G. (2017). Representación de agregar el elemento 6 y después el 100 a una pila [ilustración].



A continuación y partiendo de los elementos que hemos agregado a la pila realizamos la operación pop(), como se aprecia en la siguiente imagen, donde se declara el código en Lenguaje C.



Declaración de la operación pop() en Lenguaje C

Cervantes, G. (2017). Declaración de la operación por() en Lenguaje C [ilustración].



A continuación se muestra la representación del declaración anterior, del resultado de aplicar la operación pop() a la pila.



Representación de la pila después de aplicar la operación pop()

Cervantes, G. (2017). Representación de la pila después de aplicar la operación pop() [ilustración].



Por último, se muestra en la siguiente imagen la declaración completa del código en Lenguaje C para implementar las operaciones push() y pop().



Declaración de las operaciones push() y pop() para una pila en Lenguaje C

Cervantes, G. (2017). Declaración de las operaciones push() y pop() para una pila en Lenguaje C [ilustración].

Definición del tipo de dato abstracto cola


En la vida cotidiana es muy común ver las colas como una forma de agilizar los servicios de una empresa u organización. En informática, una cola representa una estructura de datos en la cual sólo se pueden insertar nodos en uno de los extremos de la lista y sólo se pueden eliminar nodos en el otro extremo. También se le llama estructura FIFO (first-in, first-out o primera entrada, primera salida), debido a que el primer elemento en entrar será también el primero en salir. Al igual que las pilas, las escrituras de los datos son inserciones de nodos y las lecturas siempre eliminan el nodo leído.

Las colas se utilizan en sistemas informáticos, bancos, empresas, servicios, transportes y operaciones de investigación (entre otros), donde los objetos, transacciones, personas o eventos son tomados como datos que se almacenan y se guardan mediante colas para su posterior procesamiento, tal cual como una fila (cola) en el banco, el proceso implica que la primera persona que entra sea la primera que salga.

En el siguiente ejemplo vemos una representación gráfica de una cola.



Representación abstracta de una cola

Cervantes, G. (2017). Representación abstracta de una cola [ilustración].



Definición de las operaciones sobre colas





Bicolas


La doble cola o bicola es una variante de las colas simples. Ésta es una cola de dos dimensiones en la que las inserciones y eliminaciones pueden realizarse en cualquiera de los dos extremos de la lista, pero no por la mitad. A diferencia de una cola simple, en donde sólo se necesita un método para leer y otro para escribir componentes en la lista, en una doble cola debe haber:

•Dos métodos para leer: uno para hacerlo por el frente y otro para leer por atrás.
•Dos métodos para escribir: uno para hacerlo por el frente y otro para escribir por atrás.

Por otro lado, existen dos variantes de las bicolas:






A continuación veremos de manera gráfica cómo se representan las operaciones en las bicolas DCER y DCSR. Observa en la imagen cómo por medio de flechas se muestran las inserciones y eliminaciones que se realizan sobre ellas.



Representación gráfica de las bicolas DCER y DSCR

Cervantes, G. (2017). Representación gráfica de las bicolas DCER y DSCR [ilustración].



En relación con el código anterior, es importante tomar en cuenta que el inicio de la cola debe ser declarada con dos apuntadores a nulo, uno que representa el inicio (pPrimero) y otro el final (pUltimo), como se observa en la siguiente imagen.



Representación de un apuntador a nulo (creación de una cola)

Cervantes, G. (2017). Representación de un apuntador a nulo (creación de una cola) [ilustración].



Por ejemplo, si quisiéramos agregar a la pila el elemento seis y después el elemento 100, lo declararíamos como se puede apreciar en la siguiente imagen.



Declaración para agregar el elemento 6 y el elemento 100 a una cola en Lenguaje C

Cervantes, G. (2017). Declaración para agregar el elemento 6 y el elemento 100 a una cola en Lenguaje C [ilustración].



La representación de la declaración anterior es la siguiente.



Declaración para agregar el elemento 6 y el elemento 100 a una cola en Lenguaje C

Cervantes, G. (2017). Representación de agregar el elemento 6 y después el 100 a una cola [ilustración].



Implementación de una cola


A continuación explicaremos, por medio de imágenes y código de programación en Lenguaje C, la forma de implementar una cola con una lista enlazada simple.



 Declaración de una cola en Lenguaje C

Lenguaje C [ilustración].



En relación con el código anterior, es importante tomar en cuenta que el inicio de la cola debe ser declarada con dos apuntadores a nulo, uno que representa el inicio (pPrimero) y otro el final (pUltimo), como se observa en la siguiente imagen.



Representación de un apuntador a nulo (creación de una cola)

Cervantes, G. (2017). Representación de un apuntador a nulo (creación de una cola) [ilustración].



Por ejemplo, si quisiéramos agregar a la pila el elemento seis y después el elemento 100, lo declararíamos como se puede apreciar en la siguiente imagen.



Declaración para agregar el elemento 6 y el elemento 100 a una cola en Lenguaje C

Cervantes, G. (2017). Declaración para agregar el elemento 6 y el elemento 100 a una cola en Lenguaje C [ilustración].



La representación de la declaración anterior es la siguiente.



Declaración para agregar el elemento 6 y el elemento 100 a una cola en Lenguaje C

Cervantes, G. (2017). Representación de agregar el elemento 6 y después el 100 a una cola [ilustración].



Realizamos la operación enqueue() como se aprecia en la siguiente imagen, donde se declara el código en Lenguaje C.



Declaración de la operación enqueue() en Lenguaje C

Cervantes, G. (2017). Declaración de la operación enqueue() en Lenguaje C [ilustración].



A continuación se muestra la representación de la declaración anterior, del resultado de aplicar la operación enqueue() a la cola.



Representación de la cola después de aplicar la operación enqueue()

Cervantes, G. (2017). Representación de la cola después de aplicar la operación enqueue() [ilustración].



Por último, se muestra en la siguientes imágenes la declaración completa del código en Lenguaje C para implementar las operaciones enqueue() y dequeue().



Declaración de las operaciones enqueue() y dequeue() para una pila en Lenguaje C

Declaración de las operaciones enqueue() y dequeue() para una pila en Lenguaje C

Cervantes, G. (2017). Declaración de las operaciones enqueue() y dequeue() para una pila en Lenguaje C [ilustración].

Actividad. Características de pilas y colas

Las pilas y colas son las dos estructuras de datos más básicas y pueden crearse a partir de un arreglo, pero también a través una lista.

Autoevaluación. Programación de pilas y colas

Saber programar pilas y colas es una de las habilidades básicas del programador, ya que a través dicha acción es posible adquirir habilidades de abstracción y creatividad, las cuales permiten resolver problemas de manera adecuada.

Fuentes de información

Bibliografía


Domínguez, E. D. (2014). Programación estructurada: raptor y lenguaje C. México: Alfaomega.

Guardati, S. (2015). Estructuras de datos básicas: programación orientada a objetos con java. México: Alfaomega.

Joyanes, L. (1998). Fundamentos de programación: algoritmos y estructuras de datos. Madrid: McGraw-Hill.

Kalicharan, N. (2013). Advanced topics in C: core concepts in data structures. California: Apress.

López, B. (2012). Estructuras de datos orientadas a objetivos: pseudocódigo y aplicaciones en C#.NET. México: Alfaomega.

López, B. (2015). Estructuras de datos orientadas a objetos. México: Alfaomega.

Maes, R. (2013). Physically unclonable functions: constructions, properties and applications. Berlin: Springer.

Malik, D. S. (2013). Estructura de datos con C++. México: Cengage Learning.

Weiss, M. A. (2012). Data Structures and Algorithm Analisis in Java: New Jersey: Addison-Wesley.

Documentos electrónicos

Martínez, J. M. y Castro, R. (2012). Programación (Estructura de Datos) [Versión electrónica]. México: SUAYED-FCA-UNAM. Consultado el 18 de abril de 2018 de http://fcasua.contad.unam.mx/apuntes/interiores/docs/20172/informatica/3/apunte/LI_1361_30096_A_Prog_estruc_datos_V1.pdf



Complementarias

Bibliografía López, A. (2011). Estructura de datos con JAVA: un enfoque práctico. México: UNAM-Facultad de Ciencias.

Luján, S., Ferrández, A., Peral, J. y Requena, A. (2014). Ejercicios resueltos sobre programación y estructuras de datos. Alicante: Publicaciones de la Universidad de Alicante.

Mora, A. (2014). Bases de datos: diseño y gestión. Madrid: Editorial Síntesis.

Weiss, M. A. (2013). Estructuras de datos en Java. Madrid: Pearson Educación.

Cómo citar

Texto correspondiente a esta sección.