我的代码曾经是:
for(int i=1; i<par.length(); i++)
{
if( '}'==(par.charAt(i)) )
if(parStack.pop()!='{')
return false;
else if( ')'==(par.charAt(i)) )
if(parStack.pop()!='(')
return false;
else if( ']'==(par.charAt(i)) )
if(parStack.pop()!='[')
return false;
else if ( '{'==(par.charAt(i)) || '['==(par.charAt(i)) || '('==(par.charAt(i)))
parStack.push(par.charAt(i));
}
不幸的是,它无法正常工作。由于错误的性质(仅适用于{}括号开始/结束),我意识到else是多余的(因为该方法无论如何都会返回false),所以我删除它,代码看起来像这样:
for(int i=1; i<par.length(); i++)
{
if( '}'==(par.charAt(i)) )
if(parStack.pop()!='{')
return false;
if( ')'==(par.charAt(i)) )
if(parStack.pop()!='(')
return false;
if( ']'==(par.charAt(i)) )
if(parStack.pop()!='[')
return false;
if ( '{'==(par.charAt(i)) || '['==(par.charAt(i)) || '('==(par.charAt(i)))
parStack.push(par.charAt(i));
}
然后代码工作得很好。我想知道为什么会出现这个错误?我认为上面的代码不需要括号,因为它是所有单个语句。
答案 0 :(得分:3)
只是因为你以这种方式缩进代码,它不会像你期望的那样工作(这不是Python)。
实际上,行
if( '}'==(par.charAt(i)) )
if(parStack.pop()!='{')
return false;
else if( ')'==(par.charAt(i)) )
if(parStack.pop()!='(')
return false;
...
相当于:
if( '}'==(par.charAt(i)) )
if(parStack.pop()!='{')
return false;
else if( ')'==(par.charAt(i)) )
if(parStack.pop()!='(')
return false;
...
这不是你想要的。
你可以做些什么来避免这种情况?你可以使用带有自动包围的IDE,比如Eclipse。或者只是自己使用括号:
if ('}' == (par.charAt(i))) {
if (parStack.pop() != '{') {
return false;
}
} else if (')' == (par.charAt(i))) {
if (parStack.pop() != '(') {
return false;
}
} ...
答案 1 :(得分:1)
我认为这是因为第一个else应用于代码的这一部分中最近的if语句,即第二个if语句。:
if( '}'==(par.charAt(i)) )
if(parStack.pop()!='{')
return false;
else if( ')'==(par.charAt(i)) )
if(parStack.pop()!='(')
return false;
为了使其按预期工作,您至少需要将外部ifs括起来:
if( '}'==(par.charAt(i)) )
{
if(parStack.pop()!='{')
return false;
}
else if( ')'==(par.charAt(i)) )
{
if(parStack.pop()!='(')
return false;
}
....