La pila es una de las estructuras de datos más populares en algoritmos. Al usar pilas, los elementos que se añaden en último lugar son los primeros en ser removidos. Es como una pila de platos: solo puedes quitar el plato de arriba hasta que hayas sacado todos los que están sobre él.
Una pila puede emplearse en numerosas situaciones del mundo real. Por ejemplo, al abrir sitios web en un navegador, puedes hacer clic en el botón de retroceso para volver a la página anterior. El historial de páginas podría almacenarse en una pila, y al pulsar el botón de retroceso regresas a la parte superior de esa pila. Si lo presionas de nuevo, la página en la parte superior se elimina y pasas automáticamente a la que está justo debajo.
Existen varias maneras de implementar una pila en un lenguaje de programación como Python:
Utilizando list - el elemento superior de la cola será el último elemento de la lista. Podemos añadir con append, quitar con pop y obtener el elemento con [-1].
Utilizando deque de collections - ofrece la posibilidad de añadir y eliminar elementos tanto al inicio como al final.
LifoQueue de queue - cola de tipo último en entrar, primero en salir, que en esencia define la estructura de una pila.
from queue import LifoQueue
stack = LifoQueue()
# insertar
stack.put(1)
stack.put(2)
stack.put(3)
# extraer
print(stack.get()) # imprime 3
print(stack.get()) # imprime 2
# ver tope
print(stack.queue[-1]) # imprime 1
print(stack.empty()) # comprobar si está vacía -> imprime False
# Usando una lista simple
stack = []
# insertar
stack.append(1)
stack.append(2)
stack.append(3)
# extraer
print(stack.pop()) # imprime 3
print(stack.pop()) # imprime 2
# ver tope
print(stack[-1]) # imprime 1
print(len(stack) == 0) # comprobar si está vacía -> imprime False
Desafío: Comprobar si la secuencia de paréntesis es válida
Dada una secuencia de paréntesis de una expresión matemática (por ejemplo, (()())), se requiere determinar si es válida. Una secuencia de paréntesis es válida si cada paréntesis de apertura tiene su correspondiente paréntesis de cierre y no hay paréntesis adicionales de ningún tipo.
Entrada
La única línea de la entrada contiene una sola cadena b (1 ≤ |b| ≤ ) con la secuencia de paréntesis.
Salida
El programa debe imprimir Yes si la secuencia de paréntesis es válida y No en caso contrario.