Đề bài
Trong C++, RAII gắn một tài nguyên với vòng đời của đối tượng: tài nguyên được giải phóng tự động khi đối tượng ra khỏi phạm vi. Các đối tượng trong cùng phạm vi bị hủy theo thứ tự ngược với lúc tạo.
Xử lý các sự kiện theo thứ tự:
{: vào một phạm vi con mới.}: rời phạm vi hiện tại; mọi tài nguyên được tạo trong đó được giải phóng, mới nhất trước.acquire <name>: tạo một tài nguyên trong phạm vi hiện tại.
Khi hết sự kiện, các phạm vi còn mở kết thúc từ trong cùng ra ngoài cùng (kể cả phạm vi ngoài của chương trình), giải phóng tài nguyên theo cùng cách.
Hãy viết raii_release_order(events).
Đầu vào
events: Các sự kiện. Dấu ngoặc cân bằng hoặc còn mở, không bao giờ đóng khi chưa mở.
Đầu ra
Trả về tên các tài nguyên theo thứ tự được giải phóng.
Ràng buộc
0 ≤ số sự kiện ≤ 100,000
Tên dài 1 đến 20 ký tự, không có khoảng trắng
Ví dụ
Đầu vào:
events = ["acquire db", "{", "acquire file", "acquire lock", "}", "acquire log"]
Kết quả mong đợi:
expected = ["lock", "file", "log", "db"]
Đầu vào:
std::vector<std::string> events = {"acquire db", "{", "acquire file", "acquire lock", "}", "acquire log"};
Kết quả mong đợi:
std::vector<std::string> expected = {"lock", "file", "log", "db"};
Đầu vào:
string[] events = new string[] {"acquire db", "{", "acquire file", "acquire lock", "}", "acquire log"};
Kết quả mong đợi:
string[] expected = new string[] {"lock", "file", "log", "db"};
Giải thích
Rời phạm vi con giải phóng lock rồi file (mới nhất trước). Cuối cùng phạm vi ngoài giải phóng log rồi db: ["lock", "file", "log", "db"].
Đầu vào:
events = ["{", "acquire a", "{", "acquire b"]
Kết quả mong đợi:
expected = ["b", "a"]
Đầu vào:
std::vector<std::string> events = {"{", "acquire a", "{", "acquire b"};
Kết quả mong đợi:
std::vector<std::string> expected = {"b", "a"};
Đầu vào:
string[] events = new string[] {"{", "acquire a", "{", "acquire b"};
Kết quả mong đợi:
string[] expected = new string[] {"b", "a"};
Giải thích
Còn hai phạm vi mở khi kết thúc: phạm vi trong cùng giải phóng b, rồi phạm vi tiếp theo giải phóng a: ["b", "a"].
Hướng tiếp cận
Hãy tự thử trước, sau đó mở từng gợi ý một.
Gợi ý 1
Giữ một ngăn xếp các phạm vi, mỗi phạm vi lưu tài nguyên theo thứ tự.
Gợi ý 2
Đóng một phạm vi sẽ giải phóng tài nguyên từ mới nhất đến cũ nhất.
Gợi ý 3
Cuối cùng, đóng mọi phạm vi còn mở, trong cùng trước.
Độ phức tạp mong đợi
thời gian O(số sự kiện), bộ nhớ phụ O(số sự kiện)
Tham khảo
Thử thách này đã được điều chỉnh cho CodeUtility. Hãy làm theo đề bài và các ràng buộc ở trên.