Cod sursa(job #2870071)

Utilizator sandupetrascoPetrasco Sandu sandupetrasco Data 12 martie 2022 04:30:44
Problema Evaluarea unei expresii Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.25 kb
#include <bits/stdc++.h>
  
using namespace std;
 
string s;
stack < int > values;
stack < char > ops;

int prec(char c) {
    if (c == '+' || c == '-') {
        return 1;
    }

    if (c == '*' || c == '/') {
        return 2;
    }

    return 0;
}

int apply(int val1, int val2, char op) {
    switch (op) {
        case '+':
            return val1 + val2;
        
        case '-':
            return val1 - val2;
        
        case '*':
            return val1 * val2;
            
        case '/':
            return val1 / val2;

        default:
            return 0;
    }

    return 0;
}

int eval() {
    for (int i = 0; i < s.size(); i++) {
        char c = s[i];

        if (c == '(') {
            ops.push(c);
        } else if (c == ')') {
            while (!ops.empty() && ops.top() != '(') {
                int val2 = values.top();
                values.pop();

                int val1 = values.top();
                values.pop();

                char op = ops.top();
                ops.pop();

                values.push(apply(val1, val2, op));
            }

            ops.pop();
        } else if (isdigit(c)) {
            int value = 0;

            while (i < s.size() && isdigit(c)) {
                value = value * 10 + c - '0';
                i++;
                c = s[i];
            }

            values.push(value);
            i--;
        } else {
            while (!ops.empty() && prec(ops.top()) >= prec(c)) {
                int val2 = values.top();
                values.pop();

                int val1 = values.top();
                values.pop();

                char op = ops.top();
                ops.pop();

                values.push(apply(val1, val2, op));
            }

            ops.push(c);
        }
    }

    while (!ops.empty()) {
        int val2 = values.top();
        values.pop();

        int val1 = values.top();
        values.pop();

        char op = ops.top();
        ops.pop();

        values.push(apply(val1, val2, op));
    }

    return values.top();
}


int main(){
    ifstream cin("evaluare.in");
    ofstream cout("evaluare.out");

    cin >> s;
    cout << eval();   

    return 0;
}