Problema
Em C++, RAII associa um recurso à vida útil de um objeto: o recurso é liberado automaticamente quando o objeto sai de escopo. Objetos no mesmo escopo são destruídos em ordem reversa de criação.
Processe os eventos na ordem:
{: entra em um novo escopo interno.}: sai do escopo atual; todo recurso adquirido nele é liberado, do mais recente para o mais antigo.acquire <name>: cria um recurso no escopo atual.
Quando os eventos acabam, os escopos abertos restantes terminam do mais interno para o mais externo (incluindo o escopo externo do programa), liberando seus recursos da mesma forma.
Implemente raii_release_order(events).
Input
events: Os eventos. As chaves estão balanceadas ou ficam abertas, nunca são fechadas sem terem sido abertas.
Output
Retorne os nomes dos recursos na ordem em que são liberados.
Restrições
0 ≤ número de eventos ≤ 100,000
Nomes têm de 1 a 20 caracteres sem espaços
Exemplos
Entrada:
events = ["acquire db", "{", "acquire file", "acquire lock", "}", "acquire log"]
Saída esperada:
expected = ["lock", "file", "log", "db"]
Entrada:
std::vector<std::string> events = {"acquire db", "{", "acquire file", "acquire lock", "}", "acquire log"};
Saída esperada:
std::vector<std::string> expected = {"lock", "file", "log", "db"};
Entrada:
string[] events = new string[] {"acquire db", "{", "acquire file", "acquire lock", "}", "acquire log"};
Saída esperada:
string[] expected = new string[] {"lock", "file", "log", "db"};
Explicação
Sair do escopo interno libera lock depois file (do mais recente para o mais antigo). No final, o escopo externo libera log depois db: ["lock", "file", "log", "db"].
Entrada:
events = ["{", "acquire a", "{", "acquire b"]
Saída esperada:
expected = ["b", "a"]
Entrada:
std::vector<std::string> events = {"{", "acquire a", "{", "acquire b"};
Saída esperada:
std::vector<std::string> expected = {"b", "a"};
Entrada:
string[] events = new string[] {"{", "acquire a", "{", "acquire b"};
Saída esperada:
string[] expected = new string[] {"b", "a"};
Explicação
Dois escopos ainda estão abertos no final: o mais interno libera b, depois o próximo libera a: ["b", "a"].
Como abordar
Tente sozinho primeiro e depois abra uma dica de cada vez.
Dica 1
Mantenha uma pilha de escopos, cada um com seus recursos em ordem.
Dica 2
Fechar um escopo libera seus recursos do mais novo para o mais antigo.
Dica 3
No final, feche todos os escopos ainda abertos, do mais interno para fora.
Complexidade esperada
tempo O(número de eventos), espaço extra O(número de eventos)
Referências
Este desafio foi adaptado para o CodeUtility. Siga o enunciado e as restrições acima.