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 括号中的条件。
我不明白我做错了什么?
两者的区别
if(st.top()!='{' || st.empty())
和
if(st.empty() || st.top()!='{')
是评估和短路的顺序。
第一行将评估
st.top()!='{'
first。如果此时 st
为空,您会得到可能表现为崩溃的未定义行为。
第二行将 first 评估
st.empty()
并且 仅当这是 false 它将继续评估 st.top()!='{'
。
这称为短路评估或简称短路。
if(st.top()!='{' || st.empty())
编译器将此行编译为两个单独的检查。由于这两个单独的检查可能是两个(甚至更多)指令,因此其中一个必须优先于另一个。
在这种情况下,
st.top() != '{'
先于st.empty()
进行评估。
` 字符串 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";
}`