Будет ли оператор ИЛИ проверять только одно условие?Сбалансированный кронштейн - PullRequest
1 голос
/ 11 июля 2019

Я делаю Сбалансированный брекет, используя стек.Мне нужно отобразить «Успех», если он совпадает, или вывести индекс (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 Ответ

1 голос
/ 11 июля 2019

Ответ на ваш вопрос

Будет ли оператор ИЛИ проверять только одно условие?Сбалансированная скобка

входит в эту цитату стандарта C ++ 20 (7.6.15 Логический оператор ИЛИ)

1 ||оператор группы слева направо.Оба операнда контекстуально преобразуются в bool (7.3).Результат равен true, если любой из его операндов равен true, и false в противном случае.В отличие от |, ||гарантирует оценку слева направо; кроме того, второй операнд не оценивается, если первый операнд имеет значение true .

После первого операнда, который является истиной, все другие операнды не оцениваются.

Например, если это условие 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 является недопустимым индексом, либо причина ошибки кроется в каком-то другом коде.

...