Необходимо написать функцию, которая проверяет правильность размещения фигурных скобок в строке. Если открывающая скобка соответствует значительному закрытию, функция должна возвращать значение true. Пример входной строки: " (()))())()
"
Добавлено два варианта решений. Какой из них лучше, и есть лучший способ решить проблему?
1:
bool parenthesis(char myString[80]) {
int k = 0;
for (int i = 0; myString[i]; ++i) {
if (myString[i] == '(')
k++;
if (myString[i] == ')')
k--;
}
if (k == 0)
return true;
else
return false;
}
2:
#include <algorithm>
#include <iostream>
#include <string>
int main()
{
std::string str = "(()))())()";
std::cout << std::boolalpha
<< (std::count(str.begin(), str.end(), '(') ==
std::count(str.begin(), str.end(), ')') && *str.begin() ==
'(' && *str.rbegin() == ')')
<< std::endl;
}
Оба они кажутся не оптимальными, поскольку они
()))((()
Я бы, вероятно, сделал подсчет, но дополнительно проверяю, что число всегда неотрицательно.
bool validate_parantheses(const std::string& str)
{
int count = 0;
for(char c : str)
{
if(c == '(')
count++;
else if(c == ')')
count--;
if(count < 0)
return false;
}
return count == 0;
}
Это легко сделать, просто добавив один для (
, вычитая один для )
, при этом забота о сумме никогда не будет отрицательной. В конце он должен быть равен нулю.
Решение 1 более читаемо и позволяет более легко исправить ошибку (которая находится в обоих решениях). См. Добавленное "return false".
bool parenthesis(char myString[80]) {
int k = 0;
for (int i = 0; myString[i]; ++i) {
if (myString[i] == '(')
k++;
if (myString[i] == ')')
k--;
if (k<0) // This was missing from your original algorithm.
return false;
}
if (k == 0)
return true;
else
return false;
Обратите внимание, что было бы сложнее, если бы ему нужно было поддерживать любые проблемы синтаксического анализа в реальном мире, например, различные типы фигурных скобок: ([[()]]) {} {{(())}}
Если у вас возникла такая проблема, решение "стек", о котором упоминалось выше, будет работать лучше, потому что вы можете нажимать открытые фигурные скобки на стек, и когда вы найдете близкую скобку, вскрыть верхнюю часть стека и проверить правильность тип.
()))))((((()
)(