В C++ RAII связывает ресурс со временем жизни объекта: ресурс освобождается автоматически, когда объект выходит из области видимости. Объекты одной области уничтожаются в обратном порядке создания.
Обработайте события по порядку:
{: вход в новую вложенную область.}: выход из текущей области; все ресурсы, захваченные в ней, освобождаются, начиная с самого нового.acquire <name>: создать ресурс в текущей области.
Когда события закончатся, оставшиеся открытые области завершаются от самой внутренней до самой внешней (включая внешнюю область программы) и освобождают ресурсы так же.
Реализуйте raii_release_order(events).
Входные данные
events: События. Скобки сбалансированы или остаются открытыми, но никогда не закрываются без открытия.
Выходные данные
Верните имена ресурсов в порядке их освобождения.
Ограничения
0 ≤ число событий ≤ 100,000
Имена длиной от 1 до 20 символов без пробелов
Примеры
Ввод:
events = ["acquire db", "{", "acquire file", "acquire lock", "}", "acquire log"]
Ожидаемый вывод:
expected = ["lock", "file", "log", "db"]
Ввод:
std::vector<std::string> events = {"acquire db", "{", "acquire file", "acquire lock", "}", "acquire log"};
Ожидаемый вывод:
std::vector<std::string> expected = {"lock", "file", "log", "db"};
Ввод:
string[] events = new string[] {"acquire db", "{", "acquire file", "acquire lock", "}", "acquire log"};
Ожидаемый вывод:
string[] expected = new string[] {"lock", "file", "log", "db"};
Пояснение
Выход из вложенной области освобождает lock, затем file (сначала самый новый). В конце внешняя область освобождает log, затем db: ["lock", "file", "log", "db"].
Ввод:
events = ["{", "acquire a", "{", "acquire b"]
Ожидаемый вывод:
expected = ["b", "a"]
Ввод:
std::vector<std::string> events = {"{", "acquire a", "{", "acquire b"};
Ожидаемый вывод:
std::vector<std::string> expected = {"b", "a"};
Ввод:
string[] events = new string[] {"{", "acquire a", "{", "acquire b"};
Ожидаемый вывод:
string[] expected = new string[] {"b", "a"};
Пояснение
В конце открыты две области: самая внутренняя освобождает b, затем следующая освобождает a: ["b", "a"].
Как подступиться
Сначала попробуйте сами, затем открывайте подсказки по одной.
Подсказка 1
Храните стек областей, каждая со своими ресурсами по порядку.
Подсказка 2
Закрытие области освобождает её ресурсы от самого нового к самому старому.
Подсказка 3
В конце закройте все ещё открытые области, начиная с самой внутренней.
Ожидаемая сложность
время O(число событий), доп. память O(число событий)
Ссылки
Это задание адаптировано для CodeUtility. Следуйте условию и ограничениям выше.