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