From 5c3b97fb2572ce8940439abd0652d2a7f7a623bd Mon Sep 17 00:00:00 2001 From: Syndamia Date: Sun, 11 Jan 2026 13:43:39 +0200 Subject: feat(Week13): Add solutions to most exercises --- Week13/Exercise09.cpp | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 Week13/Exercise09.cpp (limited to 'Week13/Exercise09.cpp') diff --git a/Week13/Exercise09.cpp b/Week13/Exercise09.cpp new file mode 100644 index 0000000..7b1f8fc --- /dev/null +++ b/Week13/Exercise09.cpp @@ -0,0 +1,49 @@ +#include + +/* Едно ниво на рекурсия обработва едно ниво на скоби. + * + * Тоест, при "(())", първата и последнта скоба са първото + * ниво на скоби, "()" в центъра са второто ниво. + * В "()()()" имаме три чивта скоби на едно ниво. + * + * Искаме на текущото ниво, за всяка отваряща скоба да има затваряща, + * и искаме това да е изпълнено и за всяко вътрешно/долно ниво. + * + * Има два начина това да не е изпълнено: ако липсва отваряща скоба + * или ако липсва затваряща. + * Съответно, или няма да влезем в цикъла или ще излезем рано от него. + * Което означава, че няма да инкрементираме str. + * + * Тоест, str е един вид указателя към последната буква, преди + * която скобите са балансирани. + */ +bool balanced(const char*& str) { + while (*str == '(') { + str += 1; + + balanced(str); + + if (*str != ')') + return false; + + str += 1; + } + + return *str == '\0'; +} + +int main() { + const unsigned MAX_LEN = 1024; + + char line[MAX_LEN]; + std::cin.getline(line, MAX_LEN); + + const char* ptr = line; + + if (balanced(ptr)) + std::cout << "Balanced" << std::endl; + else + std::cout << "Not balanced" << std::endl; + + return 0; +} -- cgit v1.3.1-23-gd82d