A stack (pilha) é uma das estruturas de dados mais populares em algoritmos. Numa stack, os elementos que entram por último são os primeiros a sair. Podemos compará-la a uma pilha de pratos, na qual só conseguimos remover o prato do topo. Para chegar aos pratos de baixo, temos de retirar todos os que estão acima.
Uma stack pode ser usada em muitas situações do dia a dia. Ao abrir sites num navegador, é possível clicar no botão “voltar” para regressar à página anterior. O histórico de páginas pode ser guardado numa stack, de modo que, quando carregamos em “voltar”, somos redirecionados para o elemento que está no topo. Se voltarmos a carregar em “voltar”, elimina-se a página do topo da stack e passamos para a página imediatamente abaixo.
Existem várias formas de implementar uma stack numa linguagem de programação como Python:
Usar list – o elemento no topo será o último elemento da lista. Podemos adicionar com append, remover com pop e aceder ao elemento com [-1].
Usar deque de collections – suporta adicionar e remover elementos tanto do início como do fim.
LifoQueue de queue – fila do tipo “last in, first out”, que é essencialmente a definição de uma stack.
from queue import LifoQueue
stack = LifoQueue()
# inserir
stack.put(1)
stack.put(2)
stack.put(3)
# remover
print(stack.get()) # imprime 3
print(stack.get()) # imprime 2
# ver topo
print(stack.queue[-1]) # imprime 1
print(stack.empty()) # verificar se está vazio -> imprime False
# Usando uma lista simples
stack = []
# inserir
stack.append(1)
stack.append(2)
stack.append(3)
# remover
print(stack.pop()) # imprime 3
print(stack.pop()) # imprime 2
# ver topo
print(stack[-1]) # imprime 1
print(len(stack) == 0) # verificar se está vazio -> imprime False
Desafio: Verificar se a sequência de parênteses é válida
Dada uma sequência de parênteses de uma expressão matemática (por exemplo, (()())), é necessário verificar se essa sequência é válida. Uma sequência de parênteses é considerada válida se cada parêntese de abertura tiver um correspondente de fecho e não houver parênteses extras ou em falta.
Entrada
A única linha da entrada contém uma linha b (1 ≤ |b| ≤ ) com a sequência de parênteses.
Saída
O programa deve imprimir Yes caso a sequência de parênteses seja válida, ou No caso contrário.