我已经在 Hackerrank 上解决了 Balanced Brackets 并且遇到了这个错误...有人可以帮助我理解这个吗?

问题描述 投票:0回答:3

https://www.hackerrank.com/challenges/balanced-brackets/problem 这是问题链接

这是我的代码:

 #include <bits/stdc++.h>

using namespace std;

// Complete the isBalanced function below.
string isBalanced(string s) {
    stack<char> st;
    for(int i=0;i<(int)s.size();i++)
    {
        switch(s[i])
        {
            case  '(' :
            case  '{' :
            case  '[' :
                st.push(s[i]);
                break;
            case ')' :
                **if(st.top()!='(' || st.empty())**
                {
                    return "NO";
                }
                st.pop();
                break;
            case '}' :
                **if(st.top()!='{' || st.empty())**
                {
                    return "NO";
                }
                st.pop();
                break;
            case ']' :
                **if(st.top()!='[' || st.empty())**
                {
                    return "NO";
                }
                st.pop();
                break;
        }
    }
    return st.empty() ? "YES" : "NO";
}
int main()
{
    ofstream fout(getenv("OUTPUT_PATH"));

    int t;
    cin >> t;
    cin.ignore(numeric_limits<streamsize>::max(), '\n');

    for (int t_itr = 0; t_itr < t; t_itr++) {
        string s;
        getline(cin, s);

        string result = isBalanced(s);

        fout << result << "\n";
    }

    fout.close();

    return 0;
}

此代码不起作用。所以我用谷歌搜索找到了正确的代码。
请在此处查看正确的代码:

#include <bits/stdc++.h>

using namespace std;

// Complete the isBalanced function below.
string isBalanced(string s) {
    stack<char> st;
    for(int i=0;i<(int)s.size();i++)
    {
        switch(s[i])
        {
            case  '(' :
            case  '{' :
            case  '[' :
                st.push(s[i]);
                break;
            case ')' :
                if(st.empty() || st.top()!='(')
                {
                    return "NO";
                }
                st.pop();
                break;
            case '}' :
                if(st.empty() || st.top()!='{')
                {
                    return "NO";
                }
                st.pop();
                break;
            case ']' :
                if(st.empty() || st.top()!='[')
                {
                    return "NO";
                }
                st.pop();
                break;
        }
    }
    return st.empty() ? "YES" : "NO";
}
int main()
{
    ofstream fout(getenv("OUTPUT_PATH"));

    int t;
    cin >> t;
    cin.ignore(numeric_limits<streamsize>::max(), '\n');

    for (int t_itr = 0; t_itr < t; t_itr++) {
        string s;
        getline(cin, s);

        string result = isBalanced(s);

        fout << result << "\n";
    }

    fout.close();

    return 0;
}

这是正确的代码,唯一的区别是 if 括号中的条件。
我不明白我做错了什么?

c++ stack
3个回答
1
投票

两者的区别

if(st.top()!='{' || st.empty())

if(st.empty() || st.top()!='{')

是评估和短路的顺序。


第一行将评估

st.top()!='{'
first。如果此时
st
为空,您会得到可能表现为崩溃的未定义行为。

第二行将 first 评估

st.empty()
并且 仅当这是 false 它将继续评估
st.top()!='{'

这称为短路评估或简称短路。


0
投票

if(st.top()!='{' || st.empty())

编译器将此行编译为两个单独的检查。由于这两个单独的检查可能是两个(甚至更多)指令,因此其中一个必须优先于另一个。

在这种情况下,

st.top() != '{'
先于
st.empty()
进行评估。


0
投票

` 字符串 isBalanced(字符串 s) { std::向量堆栈; 布尔 isBalanced = true;

for (char ch : s) {
    switch (ch) {
        case '{':
        case '(':
        case '[':
            stack.push_back(ch);
            break;
        case '}':
            if (!stack.empty() && stack.back() == '{')
                stack.pop_back();
            else
                isBalanced = false;
            break;
        case ')':
            if (!stack.empty() && stack.back() == '(')
                stack.pop_back();
            else
                isBalanced = false;
            break;
        case ']':
            if (!stack.empty() && stack.back() == '[')
                stack.pop_back();
            else
                isBalanced = false;
            break;
    }
}

if (isBalanced && !stack.empty())
    isBalanced = false;

return isBalanced ? "YES" : "NO";

}`

© www.soinside.com 2019 - 2024. All rights reserved.