我在下面的括号验证程序中得到了错误的输出?怎么了?

时间:2013-10-12 10:01:39

标签: c++

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

2 个答案:

答案 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.
}