0

例如,如果输入是“(A + (BC)) (giggity (this text) is not in the expression)”,它将返回 (0, 9),因为第一个括号是 0,第二个是9 日?

如果没有,请告诉我如何构造一个以字符串为参数的函数,以便我自己做。

4

4 回答 4

4

匹配的括号通常使用堆栈找到:从左到右遍历字符串,当你找到开始的时候,你把当前位置推到堆栈,当你找到结束的时候 - 你从堆栈中弹出值。弹出的值将是匹配左括号的位置。

于 2010-12-31T21:40:26.710 回答
2

标准库中没有内置函数可以做到这一点,但它真的很容易编写:

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;
}
于 2010-12-31T21:43:46.060 回答
0

您可能需要考虑使用词法分析器解析器生成器来解决您的问题。

于 2010-12-31T21:42:46.373 回答
0

我不会告诉你如何构造这样的函数,因为我认为你想要做的是评估它们,从而创建一个解析器,并且只知道位置是错误的。

例如,考虑:

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

知道位置如何帮助您解析该表达式?

正如 n0rd 刚刚发布的那样,您需要一台堆栈机器来执行此操作。将 FILO(先进后出)模型考虑到括号的评估顺序......由内而外。

于 2010-12-31T21:43:08.617 回答