如果只检查一种情况,OR语句会输入吗?平衡支架

时间:2019-07-11 14:20:41

标签: c++ if-statement logical-operators

我正在使用堆栈做平衡支架。如果匹配,则需要显示“成功”,否则输出第一个不匹配的索引(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;
}

每当字符串的第一个字符是右括号(')'或']'之一时,我都会遇到分段错误(内核已转储)。当输入为'}'时工作,但现在为')'或']'

1 个答案:

答案 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是无效的索引,或者错误的原因在于其他代码。