diff options
feat(Week13): Add solutions to most exercises
1 files changed, 49 insertions, 0 deletions
| -rw-r--r-- | Week13/Exercise09.cpp | 49 |
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 <iostream> + +/* Едно ниво на рекурсия обработва едно ниво на скоби. + * + * Тоест, при "(())", първата и последнта скоба са първото + * ниво на скоби, "()" в центъра са второто ниво. + * В "()()()" имаме три чивта скоби на едно ниво. + * + * Искаме на текущото ниво, за всяка отваряща скоба да има затваряща, + * и искаме това да е изпълнено и за всяко вътрешно/долно ниво. + * + * Има два начина това да не е изпълнено: ако липсва отваряща скоба + * или ако липсва затваряща. + * Съответно, или няма да влезем в цикъла или ще излезем рано от него. + * Което означава, че няма да инкрементираме 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; +} |
