Cod sursa(job #2727561)

Utilizator vansJos da pa perete vans Data 22 martie 2021 09:05:14
Problema Evaluarea unei expresii Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.8 kb
#include <bits/stdc++.h>

using namespace std;

const int NMAX = 1e5;

int sl;
char s[NMAX + 1];

inline int applyOp(const int X, const int Y, const char OP) {
    if(OP == '+') return X + Y;
    if(OP == '-') return X - Y;
    if(OP == '*') return X * Y;
    return X / Y;
}

inline int opVal(const char X) {
    if(X == '+' || X == '-') return 1;
    else if(X == '*' || X == '/') return 2;
    return 0;
}

int eval() {
    stack<int> vals;
    stack<char> ops;

    for(int i = 0; i < sl; ++i)
        if(s[i] == '(') ops.push(s[i]);
        else if(s[i] == ')') {
            while(!ops.empty() && ops.top() != '(') {
                int val2 = vals.top(); vals.pop();
                int val1 = vals.top(); vals.pop();
                char op = ops.top(); ops.pop();
                vals.push(applyOp(val1, val2, op));
            }
            if(!ops.empty()) ops.pop();
        } else if(isdigit(s[i])) {
            int nr = 0;
            while(i < sl && isdigit(s[i])) nr = nr * 10 + s[i] - '0', ++i;
            vals.push(nr), --i;
        } else {
            while(!ops.empty() && opVal(ops.top()) >= opVal(s[i])) {
                int val2 = vals.top(); vals.pop();
                int val1 = vals.top(); vals.pop();
                char op = ops.top(); ops.pop();
                vals.push(applyOp(val1, val2, op));
            }
            ops.push(s[i]);
        }
    while(!ops.empty()) {
        int val2 = vals.top(); vals.pop();
        int val1 = vals.top(); vals.pop();
        char op = ops.top(); ops.pop();
        vals.push(applyOp(val1, val2, op));
    }
    return vals.top();
}

int main()
{
    freopen("evaluare.in", "r", stdin);
    freopen("evaluare.out", "w", stdout);
    scanf("%s", s), sl = strlen(s), printf("%d", eval());
    return 0;
}