Есть ли функция C ++, которая помогает оценить скобки? - PullRequest
0 голосов
/ 01 января 2011

Например, если введено «(A + (BC)) (giggity (этот текст) отсутствует в выражении)», оно вернет (0, 9), потому что первая скобка на 0 ивторой на 9?

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

Ответы [ 4 ]

4 голосов
/ 01 января 2011

Соответствующие скобки обычно находятся с помощью стека: строка перемещения влево-вправо, когда вы находите открывающую единицу, вы перемещаете текущую позицию в стек, когда вы находите закрывающую одну - вы выталкиваете значение из стека. Выбранное значение будет позицией совпадающей открывающей скобки.

2 голосов
/ 01 января 2011

В стандартной библиотеке нет встроенной функции, которая делает это, но ее действительно легко написать:

pair<int,int> findparens( const char* input )
{
    int depth = 0;
    int first;
    for( const char* c = input; *c; ++c ) {
        if (*c == '(' && !depth++) first = c - input;
        else if (*c == ')' && !--depth) return make_pair(first, c - input);
    }
    throw depth;
}
0 голосов
/ 01 января 2011

Я не собираюсь рассказывать вам, как построить такую ​​функцию, потому что я думаю, что вы хотите сделать, это оценить их и, следовательно, создать парсер, и просто знать, что позиция неправильна.

Например, рассмотрим:

(a+b(c+d))(((d)(e+f)))

Как знание позиции помогает вам разобрать это выражение?

Как только что опубликовал n0rd, вы хотите, чтобы стековая машина делала это. Рассмотрим модель FILO (First in, Last Out) в порядке вычисления скобок ... наизнанку.

0 голосов
/ 01 января 2011

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

...