#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; }