我正在编写代码来检查表达式的括号,该表达式存储为字符串。
字符串的每个字符都存储在 tokens[i].type 中。
例如:如果 exp 是 (1+2) 返回 true,如果是 (1+2)*(3+4) 返回 false
代码是这样的。
bool check_parentheses(int p, int q)
{
int cnt = 0;
int i = p;
for(; i <= q; ++i)
{
if(tokens[i].type == '(') {++cnt;}
else if(tokens[i].type == ')') {--cnt;}
if(cnt == 0 && tokens[p].type == '(' && tokens[q].type == ')') {break;}
}
if(i == q) return true; else return false;
return false;
// int i = p;
// for(; i <= q; ++i)
// {
// if(tokens[i].type == '(') {++cnt;}
// else if(tokens[i].type == ')') {--cnt;}
// if(cnt == 0 && tokens[p].type == '(' && tokens[q].type == ')' && i == q) return true; else return false;
// }
// return false;
}
未注释的代码运行良好,而带注释的代码则运行不佳。使用 gdb,我发现每次它在 for 循环中运行时,带注释的只是跳过循环并返回 false,而其他步骤进入循环并正常执行代码。
我认为两者是相同的,但想知道为什么它们的行为不同。
替代方案并不等效:
if(cnt == 0 && tokens[p].type == '(' && tokens[q].type == ')') {break;}
将在第一个左括号处中断,这是不正确的。另请注意以下备注:
p
、q
和 i
可能应该具有类型 size_t
而不是 int
q
应该是切片末尾 after 第一个条目的索引,以便您可以调用 check_parentheses(0, number_of_tokens)
这是根据这些建议的修改版本:
bool check_parentheses(size_t p, size_t q)
{
int count = 0;
for (size_t i = p; i < q; ++i) {
if (tokens[i].type == '(') {
++count;
} else
if (tokens[i].type == ')') {
if (count == 0)
return false;
--count;
}
}
return count == 0;
}