循环中判断条件的先后顺序

  • 在for或者while循环中,采用&&连接多个判断条件时注意顺序,否则可能产生越界错误,不注意很难debug

就如AcWing3302表达式求值
在对新的字符和符号栈顶字符优先级进行比较时:
while(pr[op.top()]>=pr[c]&&op.top()!='('&&op.size()) eval(); 导致Segment Fault,因为这里的op.top()可能不存在,op.size()可能已经为0
while(op.size()&&pr[op.top()]>=pr[c]&&op.top()!='(') eval(); 是正确的
一定要注意把可能导致越界的判定条件误放在最前面

#include<iostream>
#include<algorithm>
#include<unordered_map>
#include<cstring>
#include<stack>
using namespace std;
stack<int> num;
stack<char> op;

void eval()
{ 
    auto b = num.top(); num.pop();
    auto a = num.top(); num.pop();
    auto c = op.top(); op.pop();
    int x;
    if (c == '+') x = a + b;
    else if (c == '-') x = a - b;
    else if (c == '*') x = a * b;
    else x = a / b;
    num.push(x);
}

int main()
{ 
    unordered_map<char, int> pr{ { '+',1},{ '-',1},{ '*', 2},{ '/',2}};
    string str; cin>>str;
    for(int i=0; i<str.size(); i++){ 
        char c=str[i];
        if (isdigit(c))
        { 
            int x = 0, j = i;
            while (j < str.size() && isdigit(str[j]))
                x = x * 10 + str[j ++ ] - '0';
            i = j - 1;
            num.push(x);
        }
        else if(c=='(') op.push(c);
        else if(c==')'){ 
            while(op.top()!='(') eval();
            op.pop();
        }
        else{ 
            while(pr[op.top()]>=pr[c]&&op.top()!='('&&op.size()) eval();
            op.size() && op.top() != '(' && pr[op.top()] >= pr[c]
            op.push(c);
        }
    }
    while(op.size()) eval();
    cout<<num.top()<<endl;
    return 0;
}
    原文作者:Biang-Biang
    原文地址: https://blog.csdn.net/weixin_45758110/article/details/115584605
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞