-4
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
4

2 回答 2

2

最后没有return语句。给定的字符串break在第一次迭代时将执行发送到第一个,因此执行在函数的末尾没有返回值。这是未定义的行为,您将其视为无意义的返回值。

我建议将 替换为flag=1; break;,return false;并且通常清理和评论控制流,以便很容易看到应该发生的事情。

所有flag=1;实例都确定返回值将是false,因此它们都可以替换为return false;

于 2013-10-12T10:10:48.650 回答
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.
}
于 2013-10-12T10:10:57.763 回答