Website Summary Files Commits Branches @commit @diff @stats
path: root / Week13 / Exercise09.cpp
blob: 7b1f8fc9f0af1c9e77953ea499ee99298320d5a7 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
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;
}