我正在尝试用C ++创建平衡括号代码。我有两个功能,is_balanced
和convert_bracket
。基本上,在is_balanced
中,我将左括号添加到堆栈中,并在字符串中出现相应的右括号时将其弹出。但是,由于某些原因,s == convert_bracket(bracketStack.top())
即使s = '('
和bracketStack.top() == ')'
(convert_bracket会将其转换为'('
)也始终失败。我需要通过此条件才能将项目从堆栈中取出。我可以得到任何建议吗?
#include <map>
#include <set>
#include <stack>
#include <string>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <unordered_map>
using namespace std;
char convert_bracket(char s) {
switch(s){
case ')': s = '(';
break;
case ']': s= '[';
break;
case '}': s= '{';
break;
}
return s;
}
bool is_balanced(string expression) {
stack<char> bracketStack;
for(char s : expression){
if(s == '(' || s == '[' || s == '{'){
bracketStack.push(s);
} else {
if(bracketStack.size()>0 && s == convert_bracket(bracketStack.top())) {
bracketStack.pop();
} else {
return false;
}
}
}
if(bracketStack.size() == 0)
{
return true;
} else {
return false;
}
}
int main(){
string expression = "{[()]}";
bool answer = is_balanced(expression);
if(answer)
cout << "YES\n";
else cout << "NO\n";
return 0;
}
答案 0 :(得分:2)
将3个开放式括号类型推入堆栈。但是,您的case语句正在检查3个close类型,因此它总是返回传入的内容,因此检查将失败。
切换逻辑,如下所示:
char convert_bracket(char s)
{
switch(s)
{
case '(': s = ')';
break;
case '[': s= ']';
break;
case '{': s= '}';
break;
}
return s;
}
答案 1 :(得分:1)
您指的是Hackerrank挑战吗?诀窍是在进程结束时检查堆栈是否为空。
你最后可以使用平衡括号和不完整的括号!