是否有帮助评估括号的C ++函数?

时间:2010-12-31 21:36:03

标签: c++ string parentheses

例如,如果输入为“(A +(BC))(giggity(本文)不在表达式中”),则返回(0,9),因为第一个括号为0且第二个是在9?

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

4 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分: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;
}

答案 2 :(得分:0)

您可以考虑使用lexerparser generator来解决问题。

答案 3 :(得分:0)

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

例如,考虑:

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

如何知道这个位置可以帮助你解析那个表达式?

正如n0rd刚发布的那样,你想要一台堆栈机器来做这件事。考虑FILO(先进先出)模型到括号的评估顺序......从里到外。