Pilas y Colas
Pilas y Colas
Pilas y Colas
Algoritmos y
Estructura de
Datos I
1
Pilas y colas
En esta lectura, se abordarán dos estructuras de datos: pilas y colas. Ambas
son muy usadas en el ámbito informático, por lo cual es importante lograr
comprenderlas.
Pilas
Las pilas o stacks (en inglés) son estructuras de datos lineales,
contenedores de nodos que presentan restricciones en la adición y en el
borrado de sus elementos: el último nodo añadido es el primero en salir.
Una pila es una estructura lineal que permite almacenar y recuperar elementos
solo por uno de sus extremos: la parte superior.
Esta estructura también es llamada LIFO, siglas de Last In, First Out, o
último en entrar, primero en salir. Dichas siglas explican cómo trabaja la
estructura: funciona de manera análoga a cualquier apilamiento que se
hiciera de objetos del mundo real. Los elementos se van “apilando uno
encima de otro”, por lo cual, cuando se desee agregar un nuevo elemento,
este se ubicará encima del último agregado y, cuando se desee sacar uno,
se sacará el último elemento agregado.
Si, por ejemplo, se tiene una pila con dos elementos A y B y se desea
agregar un nuevo elemento C, entonces este será apilado luego del
elemento B. Si se desea agregar otro elemento D, este será apilado luego
del elemento C.
2
Figura 1: Ejemplo de cómo se van apilando los elementos en una pila
Es evidente notar que esta estructura de datos tiene como único acceso al
elemento más reciente, por lo cual es útil cuando solo se necesita acceder
3
al elemento superior. Los demás elementos serán inaccesibles. Para esos
casos existen otras estructuras más adecuadas.
Implementación
Las pilas son Los vectores son estructuras de datos estáticas, es decir, que se define su
implementadas a nivel tamaño en el momento de su creación; luego siempre tendrá ese tamaño.
de software como Genera un desperdicio de espacio, ya que, cuando se crea el vector, se
listas enlazadas o reserva el espacio de memoria para toda la estructura, aunque no esté
como vectores. Se
recomienda usar listas
toda ocupada. Sin embargo, ofrece otros beneficios, tales como el acceso
debido a que son más en un tiempo constante a sus elementos. Sin entrar en mayores detalles, el
eficientes. uso de los vectores en las pilas genera la problemática de conocer
previamente el tamaño esperable de la pila para reservarlo con
anticipación. Así, se intenta minimizar el desperdicio de la memoria. Si el
tamaño del vector que se define para la pila es menor a lo necesario,
deberá crearse una nueva pila con tamaño mayor, lo cual es muy costoso.
Operaciones
4
Obtención del tamaño: operación que retorna la cantidad de elementos
que tiene la pila.
Leer el último elemento: operación que permite obtener al último
elemento de la pila, sin eliminarlo de esta.
Vacía: es una operación que devuelve dos valores: true (verdadero) o
false (falso), correspondientes a los valores booleanos, que indican si la
lista está vacía o no, respectivamente.
Push
No se debe olvidar que una pila es una lista, por lo cual, inicialmente, se
tendrá la lista vacía.
5
Figura 5: Pila con dos elementos
Pop
6
Aplicaciones
Para realizar este control del balanceo de tokens, se usan pilas. En la pila se
agregan los tokens de apertura que se van usando (“(“, “[“, “{“, etc.).
Cuando se encuentra un token de cierre (“)”, “]”, “}”, etc.), se valida que el
elemento superior de la pila sea el token de apertura de este. Por ejemplo,
si se usan los siguientes tokens: “(“, “[“, “{“, “(“, significa que si se ingresa
“)” se está cerrando al último “(“ de la pila, correspondiente a una
secuencia correcta: “(“, “[“, “{“, “(“, “)”. En ese caso, se lo elimina. Ahora
bien, puede suceder que se ingrese “]”, lo cual no coincide con el último
token de la pila, para lo cual se informará que hay un error. Esta secuencia
sería: “(“, “[“, “{“, “(“, ”]”, lo cual evidencia que es incorrecto. Lo mismo
sucede si se ingresa un token de cierre cuando la pila está vacía. En ese
caso, la secuencia sería: “)”, cuando en realidad debería ser, al menos: “(“,
“)”.
7
a) Si el elemento sintáctico es un símbolo de
apertura, introducirlo en la pila.
b) Si se trata de un símbolo de cierre y la pila está
vacía, informar de que se ha producido un error.
c) En caso contrario, sacar un elemento de la pila. Si
el símbolo extraído no es el símbolo de apertura
correspondiente, informar de un error.
3) Al final del archivo, si la pila no está vacía, informar de
un error. (Weiss, 2013, p. 255).
Colas
Las colas o queues son estructuras de datos lineales de nodos que
presentan restricciones en la adición y en el borrado de sus elementos: el
primer nodo añadido es el primero en salir.
Una cola es una estructura lineal que permite almacenar elementos por el
extremo final y recuperar elementos por el otro extremo (por el principio).
Si, por ejemplo, tenemos una cola con dos elementos A y B, y se desea
agregar un nuevo elemento C, entonces este será encolado luego del
elemento B. Si se desea agregar otro elemento D, este será encolado luego
del elemento C. Si se desea sacar un elemento, el único elemento posible
de sacar es el A. Luego, se podrá sacar el B y, finalmente, se podrá eliminar
al C. De este modo, quedará la cola vacía. Es importante notar que una cola
no permite un acceso aleatorio a un elemento específico, sino que solo es
posible acceder al elemento más reciente.
8
Implementación
Operaciones
Enqueue
9
Ya se sabe qué son las listas circulares; sin embargo, se hará una
modificación. Debido a que en una lista circular el último elemento apunta
al primero, es evidente que es más apropiado tener a q apuntando al
último elemento, lo cual permite acceder al primero. De esta manera, se
tiene un puntero al último elemento, a través de q y un puntero al primer
elemento, a través de q.siguiente.
10
Fuente: elaboración propia.
Dequeue
11
Figura 13: Cola a la que se le eliminó el elemento A
Colas de prioridad
12
En el próximo apartado, se hablará de una aplicación de colas de prioridad
en la planificación de los procesos del sistema operativo.
Aplicaciones
13
Referencias
Cormen, T., Leiserson, C., Rivest, R., y Stein, C. (2009). Elementary Data
Structures. Introduction to Algorithms (pp. 236-241). Massachusetts, USA: The
MIT Press.
14