DEFINIR UNA PILA Y UNA COLA
En Python NO hay una sintaxis específica para pilas y colas. Usamos estructuras existentes y las limitamos para que se comporten como pilas o colas.
# ¡ESTA ES LA CLAVE!
pila = [] # Se VE como lista, pero se USA como pila
cola = deque([]) # Se VE como deque, pero se USA como cola🎯 La Diferencia NO está en la SINTAXIS, sino en el USO
Pila = Lista con restricciones
# DEFINICIÓN: Una pila es una lista que SOLO usas de esta forma:
pila = [] # Se ve como lista, pero...
# SÓLO estas operaciones la hacen pila:
pila.append(1) # ✅ Apilar - añadir al FINAL
pila.append(2)
pila.append(3)
ultimo = pila.pop() # ✅ Desapilar - sacar del FINAL
# pila.pop(0) # ❌ Esto NO es pila
# pila.insert(0, x) # ❌ Esto NO es pila
print(ultimo) # 3 (LIFO: último en entrar, primero en salir)Cola = Deque con restricciones
from collections import deque
# DEFINICIÓN: Una cola es un deque que SOLO usas de esta forma:
cola = deque() # Se ve como deque, pero...
# SÓLO estas operaciones la hacen cola:
cola.append(1) # ✅ Encolar - añadir al FINAL
cola.append(2)
cola.append(3)
primero = cola.popleft() # ✅ Desencolar - sacar del PRINCIPIO
# cola.pop() # ❌ Esto NO es cola
# cola.appendleft(x) # ❌ Esto NO es cola estándar
print(primero) # 1 (FIFO: primero en entrar, primero en salir)🧠 La CLAVE: Te toca a TI definir el comportamiento
Ejemplo: La MISMA lista puede ser pila O cola
mi_lista = [1, 2, 3]
# Si la uso ASÍ es una PILA:
mi_lista.append(4) # Apilar
ultimo = mi_lista.pop() # Desapilar
print("Es una pila:", ultimo) # 4
# Si la uso ASÍ es una COLA (ineficiente):
mi_lista.append(5) # Encolar
primero = mi_lista.pop(0) # Desencolar
print("Es una cola:", primero) # 1📋 Resumen Visual: Cómo SABER qué es cada cosa
PILA = Lista + Disciplina LIFO
pila = [] # Se crea como lista
pila.append("documento1") # Apilar
pila.append("documento2")
pila.append("documento3")
# COMPORTAMIENTO PILA:
ultimo = pila.pop() # Saco "documento3" (el ÚLTIMO que entró)
print(ultimo) # documento3 ← LIFOPILAS con Listas (Sencillo)
# Una PILA es simplemente una lista que usas de una forma ESPECIAL
pila = [] # Lista normal
# Para usarla como PILA, solo usas 2 operaciones:
pila.append(10) # 1. Meter elementos al FINAL
pila.append(20)
pila.append(30)
print(pila) # [10, 20, 30]
# Y solo sacas del FINAL
ultimo = pila.pop() # 2. Sacar el ÚLTIMO elemento
print(ultimo) # 30
print(pila) # [10, 20]
Regla de la pila: "El último que entra es el primero que sale"
# Una PILA es simplemente una lista que usas de una forma ESPECIAL pila = [] # Lista normal # Para usarla como PILA, solo usas 2 operaciones: pila.append(10) # 1. Meter elementos al FINAL pila.append(20) pila.append(30) print(pila) # [10, 20, 30] # Y solo sacas del FINAL ultimo = pila.pop() # 2. Sacar el ÚLTIMO elemento print(ultimo) # 30 print(pila) # [10, 20]
📚 COLAS con Listas (Sencillo)
# Una COLA es simplemente una lista que usas de otra forma ESPECIAL
cola = [] # Lista normal
# Para usarla como COLA:
cola.append("Ana") # 1. Meter elementos al FINAL
cola.append("Carlos")
cola.append("María")
print(cola) # ['Ana', 'Carlos', 'María']
# Pero sacas del PRINCIPIO
primero = cola.pop(0) # 2. Sacar el PRIMER elemento
print(primero) # Ana
print(cola) # ['Carlos', 'María']
Regla de la cola: "El primero que entra es el primero que sale"
# Una COLA es simplemente una lista que usas de otra forma ESPECIAL cola = [] # Lista normal # Para usarla como COLA: cola.append("Ana") # 1. Meter elementos al FINAL cola.append("Carlos") cola.append("María") print(cola) # ['Ana', 'Carlos', 'María'] # Pero sacas del PRINCIPIO primero = cola.pop(0) # 2. Sacar el PRIMER elemento print(primero) # Ana print(cola) # ['Carlos', 'María']
🎯 La DIFERENCIA Fundamental
# MISMA lista, COMPORTAMIENTO diferente
lista = []
# Si la uso ASÍ es PILA:
lista.append("A")
lista.append("B")
lista.append("C")
elemento = lista.pop() # Saco "C" (el ÚLTIMO)
print("Pila:", elemento) # C
# Si la uso ASÍ es COLA:
lista.append("X")
lista.append("Y")
lista.append("Z")
elemento = lista.pop(0) # Saco "X" (el PRIMERO)
print("Cola:", elemento) # X
# MISMA lista, COMPORTAMIENTO diferente lista = [] # Si la uso ASÍ es PILA: lista.append("A") lista.append("B") lista.append("C") elemento = lista.pop() # Saco "C" (el ÚLTIMO) print("Pila:", elemento) # C # Si la uso ASÍ es COLA: lista.append("X") lista.append("Y") lista.append("Z") elemento = lista.pop(0) # Saco "X" (el PRIMERO) print("Cola:", elemento) # X
📊 Resumen Super Sencillo
Concepto Cómo meter Cómo sacar Ejemplo de la vida real PILA append()pop()Pila de platos COLA append()pop(0)Fila del banco
| Concepto | Cómo meter | Cómo sacar | Ejemplo de la vida real |
|---|---|---|---|
| PILA | append() | pop() | Pila de platos |
| COLA | append() | pop(0) | Fila del banco |
🧠 Ejemplos Prácticos SIN deque
Ejemplo 1: Navegador Web (PILA)
# PILA de páginas visitadas
historial = []
def visitar_pagina(pagina):
historial.append(pagina)
print(f"Visitando: {pagina}")
def retroceder():
if len(historial) > 1:
historial.pop() # Saco la página actual
pagina_anterior = historial[-1] # Veo la anterior
print(f"Volviendo a: {pagina_anterior}")
return pagina_anterior
return None
# Uso
visitar_pagina("google.com") # Visitando: google.com
visitar_pagina("youtube.com") # Visitando: youtube.com
visitar_pagina("facebook.com") # Visitando: facebook.com
retroceder() # Volviendo a: youtube.com
# PILA de páginas visitadas historial = [] def visitar_pagina(pagina): historial.append(pagina) print(f"Visitando: {pagina}") def retroceder(): if len(historial) > 1: historial.pop() # Saco la página actual pagina_anterior = historial[-1] # Veo la anterior print(f"Volviendo a: {pagina_anterior}") return pagina_anterior return None # Uso visitar_pagina("google.com") # Visitando: google.com visitar_pagina("youtube.com") # Visitando: youtube.com visitar_pagina("facebook.com") # Visitando: facebook.com retroceder() # Volviendo a: youtube.com
Ejemplo 2: Fila de Impresión (COLA)
# COLA de documentos a imprimir
fila_impresion = []
def agregar_documento(documento):
fila_impresion.append(documento)
print(f"Agregado: {documento}")
def imprimir_siguiente():
if fila_impresion:
documento = fila_impresion.pop(0) # Saco el PRIMERO
print(f"Imprimiendo: {documento}")
return documento
print("No hay documentos en la fila")
return None
# Uso
agregar_documento("Tarea matemáticas") # Agregado: Tarea matemáticas
agregar_documento("Contrato trabajo") # Agregado: Contrato trabajo
agregar_documento("Receta médica") # Agregado: Receta médica
imprimir_siguiente() # Imprimiendo: Tarea matemáticas
imprimir_siguiente() # Imprimiendo: Contrato trabajo
# COLA de documentos a imprimir fila_impresion = [] def agregar_documento(documento): fila_impresion.append(documento) print(f"Agregado: {documento}") def imprimir_siguiente(): if fila_impresion: documento = fila_impresion.pop(0) # Saco el PRIMERO print(f"Imprimiendo: {documento}") return documento print("No hay documentos en la fila") return None # Uso agregar_documento("Tarea matemáticas") # Agregado: Tarea matemáticas agregar_documento("Contrato trabajo") # Agregado: Contrato trabajo agregar_documento("Receta médica") # Agregado: Receta médica imprimir_siguiente() # Imprimiendo: Tarea matemáticas imprimir_siguiente() # Imprimiendo: Contrato trabajo
💡 Truco para Recordar
PILA = pop() SIN número
pila = []
pila.append(1)
pila.append(2)
pila.append(3)
print(pila.pop()) # 3 ← ÚLTIMO que entró
print(pila.pop()) # 2
print(pila.pop()) # 1 ← PRIMERO que entró
pila = [] pila.append(1) pila.append(2) pila.append(3) print(pila.pop()) # 3 ← ÚLTIMO que entró print(pila.pop()) # 2 print(pila.pop()) # 1 ← PRIMERO que entró
COLA = pop(0) CON cero
cola = []
cola.append(1)
cola.append(2)
cola.append(3)
print(cola.pop(0)) # 1 ← PRIMERO que entró
print(cola.pop(0)) # 2
print(cola.pop(0)) # 3 ← ÚLTIMO que entró
cola = [] cola.append(1) cola.append(2) cola.append(3) print(cola.pop(0)) # 1 ← PRIMERO que entró print(cola.pop(0)) # 2 print(cola.pop(0)) # 3 ← ÚLTIMO que entró
🚨 Nota sobre Eficiencia
# Para PROGRAMAS PEQUEÑOS está BIEN usar listas
cola = []
cola.append(1)
cola.append(2)
elemento = cola.pop(0) # ✅ OK para pocos elementos
# Para programas GRANDES con MUCHOS datos:
from collections import deque # Esto sería más eficiente
cola_grande = deque()
cola_grande.append(1)
cola_grande.append(2)
elemento = cola_grande.popleft() # Más rápido para muchos elementos
# Para PROGRAMAS PEQUEÑOS está BIEN usar listas cola = [] cola.append(1) cola.append(2) elemento = cola.pop(0) # ✅ OK para pocos elementos # Para programas GRANDES con MUCHOS datos: from collections import deque # Esto sería más eficiente cola_grande = deque() cola_grande.append(1) cola_grande.append(2) elemento = cola_grande.popleft() # Más rápido para muchos elementos
✅ Conclusión para Principiantes
PILA = Lista + pop() (sin número)
COLA = Lista + pop(0) (con cero)
La diferencia está en cómo sacas los elementos
Para empezar, olvídate de deque
PILA = Lista + pop() (sin número)
COLA = Lista + pop(0) (con cero)
La diferencia está en cómo sacas los elementos
Para empezar, olvídate de deque
COLA = Deque + Disciplina FIFO
from collections import deque
cola = deque() # Se crea como deque
cola.append("persona1") # Encolar
cola.append("persona2")
cola.append("persona3")
# COMPORTAMIENTO COLA:
primero = cola.popleft() # Saco "persona1" (el PRIMERO que entró)
print(primero) # persona1 ← FIFO🚨 ¿Por qué esta confusión?
Python es un lenguaje de tipado dinámico que prefiere:
No crear syntax nueva para cada concepto
Reutilizar estructuras existentes
Confiarnos la disciplina de uso
💡 Truco Práctico: Nomenclatura
Para evitar confusiones, usa nombres descriptivos:
# ✅ CLARO - Sabes inmediatamente qué es
pila_documentos = []
cola_clientes = deque()
# ❌ CONFUSO - ¿Es lista normal o pila?
lista1 = []
lista2 = deque()🎯 Reglas Mnemotécnicas
Para PILAS:
"Saco siempre el ÚLTIMO que metí"
Como una pila de platos - sacas el de arriba
Para COLAS:
"Atiendo siempre al PRIMERO que llegó"
Como la fila del banco - atiendes al primero en llegar
🔄 Ejemplo Real: Editor de Texto
# PILA para undo/redo
historial_undo = [] # ¡Se VE como lista!
historial_redo = [] # ¡Se VE como lista!
# Operaciones como PILA:
def hacer_cambio(accion):
historial_undo.append(accion) # APILAR
historial_redo.clear()
def deshacer():
if historial_undo:
accion = historial_undo.pop() # DESAPILAR (LIFO)
historial_redo.append(accion)
return accion
return None
def rehacer():
if historial_redo:
accion = historial_redo.pop() # DESAPILAR (LIFO)
historial_undo.append(accion)
return accion
return None✅ Conclusión Final
Pila = Lista que solo usas con
append()ypop()Cola = Deque que solo usas con
append()ypopleft()La diferencia NO está en cómo se crean, sino en cómo los usas
¡Tú decides si esa estructura se comporta como pila, cola o lista normal!
¿Ahora tiene más sentido? ¡Es normal confundirse al principio!
Comentarios
Publicar un comentario