Deshacer y la impresora de la oficina
Escribes un informe y borras un párrafo sin querer. Pulsas Ctrl+Z y vuelve el párrafo, no lo que escribiste hace una hora.
En la misma oficina, cinco personas mandan documentos a la impresora. Sale primero el de quien lo mandó antes.
Los dos programas guardan una lista de cosas pendientes. Lo que cambia es cuál sacan primero.
Al final de esta lección
Nota
Puedo elegir una pila o una cola para un trabajo.
Palabras clave
| Palabra | Qué significa | Ejemplo |
|---|---|---|
| Pila | sale primero el último que entró | |
| Cola | sale primero el primero que entró | |
| Apilar | poner un elemento encima de la pila | history.append(x) |
| Desapilar | sacar el elemento de arriba | history.pop() |
| Encolar | poner un elemento al final de la cola | |
| Desencolar | sacar el elemento del principio de la cola |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Una pila saca primero lo último
Piensa en una pila de platos en la cocina de un restaurante. Pones los limpios encima y coges siempre el de arriba.
Una pila de datos funciona igual. Apilar pone un elemento arriba. Desapilar saca el de arriba.
En Python basta una lista: append apila y pop() desapila. El botón de deshacer, el botón Atrás del navegador y muchas calculadoras usan una pila.
Prueba: deshacer cambios
# Cada cambio en un documento se apila: el último queda arriba.
history = []
history.append("Escribir el título")
history.append("Poner el título en negrita")
history.append("Borrar un párrafo")
print("Historial:", history)
# Ctrl+Z deshace el cambio de arriba: el último que entró.
undone = history.pop()
print("Deshecho:", undone)
print("Historial:", history)
# Añade un segundo pop() para deshacer otro cambio y ejecuta.
Una cola saca primero lo primero
En la cola del súper, atienden primero a quien llegó antes. Una cola de datos hace lo mismo.
Encolar pone un elemento al final. Desencolar saca el del principio.
En Python se usa deque, de la biblioteca estándar. append encola y popleft() desencola. Las impresoras compartidas, los tiques de soporte y los pedidos de un almacén usan colas.
Prueba: la impresora compartida
from collections import deque
# La impresora de la oficina atiende los trabajos por orden de llegada.
printer = deque()
printer.append("Nóminas de octubre.pdf")
printer.append("Contrato Ruiz.docx")
printer.append("Factura 2031.pdf")
print("En cola:", list(printer))
# popleft() saca el que lleva más tiempo esperando.
first = printer.popleft()
print("Imprimiendo:", first)
print("Siguen esperando:", list(printer))
# Encola "Presupuesto.xlsx" y saca otro trabajo con popleft().
Ejemplo resuelto: pila frente a cola
| Paso | Pila (arriba a la derecha) | Cola (principio a la izquierda) |
|---|---|---|
| Entra T1 | [T1] | [T1] |
| Entra T2 | [T1, T2] | [T1, T2] |
| Entra T3 | [T1, T2, T3] | [T1, T2, T3] |
| Sale uno | Sale T3, queda [T1, T2] | Sale T1, queda [T2, T3] |
| Sale otro | Sale T2, queda [T1] | Sale T2, queda [T3] |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Un error frecuente
Advertencia
Mucha gente cree que una pila y una cola guardan los datos de forma distinta. No es así: las dos pueden ser una simple lista. Lo que cambia es por qué extremo sacas. Si atiendes tiques con pop(), el cliente que llegó primero espera el último.