例如,如果输入为“(A +(BC))(giggity(本文)不在表达式中”),则返回(0,9),因为第一个括号为0且第二个是在9?
如果没有,请告诉我如何构造一个以字符串作为参数的函数,以便我自己完成。
答案 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)
您可以考虑使用lexer和parser generator来解决问题。
答案 3 :(得分:0)
我不打算告诉你如何构建这样一个函数,因为我认为你想要做的就是评估它们,从而创建一个解析器,只知道位置是错误的。
例如,考虑:
(a+b(c+d))(((d)(e+f)))
如何知道这个位置可以帮助你解析那个表达式?
正如n0rd刚发布的那样,你想要一台堆栈机器来做这件事。考虑FILO(先进先出)模型到括号的评估顺序......从里到外。