【问题标题】:Will the OR statement in if check only one condition? Balanced Bracketif 中的 OR 语句是否只检查一个条件?平衡支架
【发布时间】:2019-07-11 14:20:41
【问题描述】:

我正在使用堆栈做平衡括号。如果匹配,我需要显示“成功”,否则输出第一个不匹配的索引(1-indexing)。

我使用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;
}

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

【问题讨论】:

  • stks的定义是什么?你能创建一个完整的段错误示例吗?
  • @FrançoisAndrieux 不,我的意思是stk.empty()。这适用于第一个字符是右括号的情况。所以堆栈是空的,因为我只推开括号。它在'}'而不是其他两个括号时工作。没有意义,因为它使用 OR 定义。
  • 好吧,我把sstk 弄混了。我以为你在检查 s 是否为空。

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


【解决方案1】:

你的问题的答案

if 中的 OR 语句是否只检查一个条件?平衡支架

在 C++ 20 标准(7.6.15 逻辑或运算符)的引用中

1 ||运算符组从左到右。操作数都是 根据上下文转换为 bool (7.3)。如果其中任何一个结果为真 它的操作数为真,否则为假。与 |、|| 不同保证 从左到右的评估; 此外,第二个操作数不是 如果第一个操作数的计算结果为真,则进行评估

在第一个为真的操作数之后,所有其他操作数都不计算。

例如,如果此条件 s[i]=='}' 评估为真,那么其他条件

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 是无效索引,要么错误原因在于其他代码。

【讨论】:

  • 不,我的意思是如果堆栈为空(这意味着没有相应的左括号)并且如果它的任何右括号输出它的索引(i + 1)。在我给它的输入中是')'所以它不满足(s[i]=='}' || s[i]==')' || s[i]==']') 中的第一个条件所以它必须检查s[i]==')' 但它给出了分段错误
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-01-12
  • 1970-01-01
  • 2014-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多