Как посчитать правильно расположенные круглые скобки из массива char?

Для подсчета правильно расположенных круглых скобок в массиве char вам потребуется использовать стек.

Стек - это структура данных, которая работает по принципу "последний пришел - первый ушел" (LIFO). Он имеет две основные операции - добавление элемента в начало стека (push) и удаление элемента из начала стека (pop).

Алгоритм решения этой задачи следующий:
1. Создайте пустой стек, в котором будут храниться открывающие скобки '('.
2. Проходите по каждому символу в массиве char.
3. Если текущий символ - открывающая скобка '(', положите ее в стек.
4. Если текущий символ - закрывающая скобка ')', проверьте:
а. Если стек пустой, то закрывающая скобка не имеет соответствующей открывающей скобки, и количество правильно расположенных скобок не увеличивается.
б. Если стек не пустой, удалите верхний элемент стека (последнюю добавленную открывающую скобку '(').
5. Повторяйте шаги 3-4 для всех символов массива char.
6. После обработки всех символов, если стек пустой, то все открывающие и закрывающие скобки нашли соответствие, и количество правильно расположенных скобок равно количеству символов в массиве char. Если стек не пустой, значит есть открывающие скобки, для которых не было найдено соответствующей закрывающей скобки, и количество правильно расположенных скобок будет меньше количества символов в массиве char.

Вот пример кода на языке C++, реализующего описанный алгоритм:

#include <iostream>
#include <stack>

int countValidParentheses(char* arr, int size) {
    std::stack<char> parenthesesStack;
    int validCount = 0;

    for (int i = 0; i < size; i++) {
        if (arr[i] == '(') {
            parenthesesStack.push(arr[i]);
        }
        else if (arr[i] == ')') {
            if (!parenthesesStack.empty()) {
                parenthesesStack.pop();
                validCount++;
            }
        }
    }

    if (parenthesesStack.empty()) {
        return validCount;
    }
    else {
        return -1; // Возвращаем -1, если есть непарные открывающие скобки
    }
}

int main() {
    char arr[] = {'(', '(', ')', ')', ')', '('};
    int size = sizeof(arr) / sizeof(arr[0]);

    int validParenthesesCount = countValidParentheses(arr, size);
    if (validParenthesesCount != -1) {
        std::cout << "Количество правильно расположенных скобок: " << validParenthesesCount << std::endl;
    }
    else {
        std::cout << "Обнаружены непарные открывающие скобки." << std::endl;
    }

    return 0;
}

В примере мы проверяем массив символов arr, содержащий скобки, и выводим количество правильно расположенных скобок. Если обнаруживаются непарные открывающие скобки, выводится соответствующее сообщение.