¿Te resulta más fácil leer con fondo crema, un tono de color, más contraste o un texto más grande? Elige tus colores y tu texto una sola vez, para todas las páginas.

Lección gratuita

Pilas y colas: LIFO y FIFO

Después de esta lección: Puedo usar una pila y una cola para resolver un problema.

Lección de 50 min3 comandosLaboratorio de compiladores y arquitectura: gcc, flex, bison y RISC-V en una VM

Una pila saca primero lo último que entró

Una pila es una estructura de datos en la que el último elemento que entra es el primero que sale; una cola es lo contrario. Con ellas se resuelven problemas muy comunes, como deshacer cambios en un editor o ordenar una cola de impresión.

Cuando pulsas Ctrl+Z, el editor deshace tu última acción, no la primera. Eso es una pila.

Al final de esta lección

Nota

Puedo usar una pila y una cola para resolver un problema.

Palabras clave

PalabraQué significaEjemplo
Pilauna estructura donde se entra y se sale por el mismo extremo
LIFOel último en entrar es el primero en salir
Colauna estructura donde se entra por detrás y se sale por delante
FIFOel primero en entrar es el primero en salir
Apilar y desapilarponer en la cima y quitar de la cimapush, pop

Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.

Una pila es LIFO

Imagina una pila de platos. Pones un plato encima y quitas el de arriba. El de abajo no se toca hasta el final.

Una pila tiene dos operaciones: apilar (push) pone un elemento en la cima y desapilar (pop) quita la cima y la devuelve. El orden es LIFO: last in, first out.

Una pila paso a paso

OperaciónLa pila queda (cima a la derecha)Devuelve
push "A"ANada
push "B"A, BNada
push "C"A, B, CNada
popA, BC
popAB

Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.

Deshacer con una pila

Código: python
# Una pila de acciones para deshacer en un editor de texto.
undo = []
undo.append("escribir hola")
undo.append("borrar una palabra")
undo.append("poner negrita")
print("Deshacer:", undo.pop())
print("Deshacer:", undo.pop())
print("Quedan:", undo)
# Añade otra acción y comprueba cuál sale primero.

Apilar dos números y desapilar

Comando
python3 -c "s = []; s.append(1); s.append(2); print(s.pop(), s.pop())"

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Leer líneas de la cima a la base

Comando
printf 'a\nb\nc\n' | tac

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Un error frecuente

Advertencia

Mucha gente cree que pop saca el primer elemento que entró. En una pila saca el último. Si necesitas sacar el más antiguo, no quieres una pila, quieres una cola.

Una cola es FIFO

En la cola de una cafetería, el primero que llegó es el primero al que atienden. Se entra por detrás y se sale por delante.

Las operaciones son encolar (enqueue), que añade al final, y desencolar (dequeue), que quita el primero. El orden es FIFO: first in, first out. Una cola de impresión funciona así.

Una cola de impresión

Código: python
# Una cola de impresión en una biblioteca.
queue = ["apuntes.pdf", "examen.pdf", "cartel.pdf"]
queue.append("factura.pdf")  # entra por detrás
first = queue.pop(0)  # sale por delante
print("Se imprime:", first)
print("Esperan:", queue)
# Cambia pop(0) por pop() y mira qué documento sale.

Una cola con deque

Comando
python3 -c "from collections import deque; q = deque(); q.append('a'); q.append('b'); print(q.popleft(), q.popleft())"

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Sacar de delante en una lista es caro

En la lección anterior viste que quitar el primer elemento de una lista obliga a desplazar todos los demás. Por eso pop(0) es caro en una cola grande.

La clase deque de Python está pensada para sacar de los dos extremos sin desplazar nada. Para colas largas, es la herramienta adecuada.

Una pila comprueba los paréntesis

Un editor de código marca un error si un paréntesis queda sin cerrar. La idea: cada apertura se apila, y cada cierre debe encontrar su apertura en la cima.

Si la cima no encaja, o la pila está vacía, los paréntesis están mal. Si al terminar queda algo en la pila, falta cerrar.

Comprobar ([a])

CarácterQué haceLa pila queda
(Apila(
[Apila(, [
aNo cuenta(, [
]La cima es [, encaja: desapila(
)La cima es (, encaja: desapilaVacía: correcto

Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.

Para ir más lejos

Una calculadora puede evaluar 3 4 + con una pila. Apila el 3 y el 4. Al llegar al +, desapila dos números, los suma y apila el resultado.

Prueba a escribirlo para 5 1 2 + 4 * +. Piensa en cuántos números hay en la pila en cada momento.

Sobre este laboratorio y su código: Laboratorio de compiladores y arquitectura: gcc, flex, bison y RISC-V en una VM

¿Enseñas a una clase? Asigna este módulo a tus alumnos con guía del profesor, tareas con corrección automática y un laboratorio para cada alumno.