我正在使用堆栈做平衡支架。如果匹配,则需要显示“成功”,否则输出第一个不匹配的索引(1-索引)。
我用stack<pair <char,int>>stk; string s;
来存储左括号('{''((''[')和括号的索引。而不是用括号括起来。
for(int i=0;i<s.size();i++)
{
if(s[i]=='{' || s[i]=='[' || s[i]=='(')
{
stk.push(make_pair(s[i],i+1));
}
else if(!stk.empty() && (s[i]=='}' && stk.top().first=='{') ||
(s[i]==')' && stk.top().first=='(') || (s[i]==']' &&
stk.top().first=='['))
{
stk.pop();
}
else if(!stk.empty() && (s[i]=='}' && stk.top().first!='{') ||
(s[i]==')' && stk.top().first!='(') || (s[i]==']' &&
stk.top().first!='['))
{
ans=(i+1);
cout<<ans;
break;
}
else if(stk.empty()&&(s[i]=='}'||s[i]==')'||s[i]==']'))
{
ans=i+1;
cout<<ans;
break;
}
}
if(stk.empty() && ans==0)
{
cout<<"Success";
}
if(!stk.empty() && ans==0)
{
cout<<stk.top().second;
}
每当字符串的第一个字符是右括号(')'或']'之一时,我都会遇到分段错误(内核已转储)。当输入为'}'时工作,但现在为')'或']'
答案 0 :(得分:1)
问题的答案
如果仅检查一种情况,OR语句是否会进入?平衡支架
在C ++ 20 Standard(7.6.15逻辑OR运算符)的引号中
1 ||操作员组从左到右。操作数都是 上下文转换为bool(7.3)。如果以下任一情况,结果为true 其操作数为true,否则为false。与|,||不同保证 从左到右的评估; 此外,第二个操作数不是 评估第一个操作数是否为true 。
在第一个为真的操作数之后,所有其他操作数均不求值。
例如,如果此条件s[i]=='}'
计算为true,则其他条件
s[i]==')'
s[i]==']'
未选中。
您还可以重写if语句
else if ( stk.empty() && ( s[i] == '}' || s[i] == ')' || s[i] == ']' ) )
喜欢
else if ( stk.empty() and ( s[i] == '}' or s[i] == ')' or s[i] == ']' ) )
对于细分错误,则i
是无效的索引,或者错误的原因在于其他代码。