БлогNot. C++: проверить правильность расстановки скобок в строке

C++: проверить правильность расстановки скобок в строке

Учебная задачка, чтобы не потерялась...

Дана строка, в которой расставлены круглые скобки. Проверить правильность их расстановки.

Если скобки только круглые, наверное, можно вот так:

#include <iostream>
#include <string>
using namespace std;
 
int bracketCount (string s) {
    int len = s.length();
    int cnt = 0;
    char last = '0';
    for (int i=0; i<len; i++) {
        if (s[i]=='(') {
            cnt++; last = '(';
        }
        else if (s[i]==')') {
         if (cnt) {
             cnt--;
             if (last!='(' && last!=')') return -1;
         }
         else return -1;
         last = ')';
        }
    }
    return cnt;
}
 
int main () {
    string s1 ("())((in)Correct(br(ack)ets)");
    cout << endl << s1 << ":" << bracketCount(s1);
    string s2 ("Correct(br(ack)ets)");
    cout << endl << s2 << ":" << bracketCount(s2);
    system("pause>nul"); return 0;
}

Любой ответ, не равный нулю означает "неправильно расставлены".

Если задача банальней и корректные вложения скобок неважны, то есть, )()( тоже правильно, хватит и функции

int bracketCount (string s) {
    int len = s.length();
    int cnt = 0;
    for (int i=0; i<len; i++)
        if (s[i]=='(') cnt++;
        else if (s[i]==')') cnt--;
    return cnt;
}

Если делать с STL и стеком, возможно решение вида

#include <iostream>
#include <stack>
#include <string>
using namespace std;

int correctBrackets(string str) {
	stack <int> stack;
	char left = '(', right = ')';
	int err = 0;
	for (unsigned i = 0; i < str.size() && !err; ++i) {
		if (str[i] == left) stack.push(i);
		else if (str[i] == right) {
			if (stack.size() > 0) stack.pop();
			else err = -1;
		}
	}
	if (!err && stack.size() > 0) err = -1;
	return err;
}

int main(int argc, char** argv) {
	string s1("())((in)Correct(br(ack)ets)");
	cout << endl << s1 << ":" << correctBrackets(s1);
	string s2("Correct(br(ack)ets)");
	cout << endl << s2 << ":" << correctBrackets(s2);
	system("pause>nul"); return 0;
}

Это, с виду, легче модифицировать, проверяя вместо str[i] == left вхождение str[i] в строку допустимых левых скобок, например, "({[", ну, и с правыми так же.

17.05.2017, 21:59 [9581 просмотр]


теги: textprocessing c++ учебное алгоритм

К этой статье пока нет комментариев, Ваш будет первым