Проверьте количество открывающих и закрывающих скобок

0

Необходимо написать функцию, которая проверяет правильность размещения фигурных скобок в строке. Если открывающая скобка соответствует значительному закрытию, функция должна возвращать значение 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;
}
  • 1
    Он вернет true для этого ввода: ()))))((((()
  • 0
    убедитесь, что k никогда не становится отрицательным, это будет работать для этого )(
Показать ещё 1 комментарий
Теги:

3 ответа

3
Лучший ответ

Оба они кажутся не оптимальными, поскольку они

()))((()

Я бы, вероятно, сделал подсчет, но дополнительно проверяю, что число всегда неотрицательно.

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

Это легко сделать, просто добавив один для (, вычитая один для ), при этом забота о сумме никогда не будет отрицательной. В конце он должен быть равен нулю.

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;

Обратите внимание, что было бы сложнее, если бы ему нужно было поддерживать любые проблемы синтаксического анализа в реальном мире, например, различные типы фигурных скобок: ([[()]]) {} {{(())}}

Если у вас возникла такая проблема, решение "стек", о котором упоминалось выше, будет работать лучше, потому что вы можете нажимать открытые фигурные скобки на стек, и когда вы найдете близкую скобку, вскрыть верхнюю часть стека и проверить правильность тип.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню