Voltar para os desafios
Médio 0 resolvidos 0% de aceitação

Ordem de liberação RAII

Descubra a ordem em que os recursos em escopos são liberados quando seus escopos terminam, como o RAII garante.

O que você vai aprender

  • Liberar recursos quando um escopo termina
  • Destruir objetos na ordem inversa da criação
  • Modelar escopos aninhados com uma pilha

Problema

Ver original (inglês)

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

Exemplo 1
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"].

Exemplo 2
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.

Aprenda com outros

Soluções da comunidade

Ainda não há soluções publicadas. Resolva este desafio para compartilhar a primeira.