bool isValid(string s) {
stack<int> brack;
int flag=0;
int i=0;
for (i=0;i<s.length();i++){
if(s[i] == '(' || s[i] == '[' || s[i] == '{'){
brack.push(s[i]);
}
if (s[i] == ')' || s[i] == '}' || s[i] == ']'){
if (brack.empty()) {flag=1;break;}
else if (s[i]==')' && brack.top()=='('){
brack.pop();
}
else if (s[i]==']' && brack.top()=='['){
brack.pop();
}
else if (s[i]=='}' && brack.top()=='{'){
brack.pop();
}
else {flag=1; break;}
}
if (brack.empty() && flag==0) return 1;
else return 0;
}
}
我的输出错误如下。我试着干跑,据我说输出应该是假的。
Input: "]"
Output: true
Expected: false
答案 0 :(得分:2)
最后没有回复声明。给定的字符串在第一次迭代时将执行发送到第一个break
,因此执行在函数结束时没有返回值。这是未定义的行为,您将其视为无意义的返回值。
我建议用flag=1; break;
替换return false;
,并且通常要清理并评论控制流程,以便很容易看到应该发生的事情。
所有flag=1;
个实例都确定返回值为false
,因此可以将它们全部替换为return false;
。
答案 1 :(得分:2)
你的返回逻辑不在正确的块中。也许一些缩进和一点点格式化将清除这一点:
bool isValid(std::string s)
{
std::stack<int> brack;
int flag=0;
size_t i=0;
for (i=0;i<s.length();i++)
{
if(s[i]=='('||s[i]=='['||s[i]=='{')
{
brack.push(s[i]);
}
if (s[i]==')' || s[i]=='}' || s[i]==']')
{
if (brack.empty())
{
flag=1;
break;
}
else if (s[i]==')' && brack.top()=='(')
{
brack.pop();
}
else if (s[i]==']' && brack.top()=='[')
{
brack.pop();
}
else if (s[i]=='}' && brack.top()=='{')
{
brack.pop();
}
else
{
flag=1;
break;
}
}
// WHY IS THIS IN THE FOR-LOOP
if (brack.empty() && flag==0)
return 1;
else
return 0;
}
// THERE IS NO RETURN VALUE FOR ALL THOSE BREAKS HERE.
}