Cod sursa(job #2923705)

Utilizator ililogIlinca ililog Data 18 septembrie 2022 11:59:01
Problema Evaluarea unei expresii Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.36 kb
using namespace std;
#include<bits/stdc++.h>

ifstream fin("evaluare.in");
ofstream fout("evaluare.out");

string s;

int prioritate(char op) {
    if (op == '*' || op == '/') {
        return 2;
    }
    
    if (op == '+' || op == '-') {
        return 1;
    }
    return 0;
}

int apply(int v1, int v2, char ch) {
    
    if (ch == '*') {
        return v1*v2;
    }
    
    if (ch == '/') {
        return v1/v2;
    }
    
    if (ch == '-') {
        return v1-v2;
    }
    
    if (ch == '+') {
        return v1+v2;
    }
    return 0;
}

int eval(string s) {
    
    stack<int> sv; ///stiva valori
    stack<char> sc; ///stiva char
    for (int i = 0; i<s.size(); i++) {
        if (s[i] == ' ') {
            continue;
        } else if (s[i] >= '0' && s[i] <= '9') {
            int val = 0;
            while (i < s.size() && s[i] >= '0' && s[i] <= '9') {
                val = val*10 + s[i] - '0';
                i++;
            }
            i--;
            sv.push(val);
        } else if (s[i] == '(') {
            sc.push('(');
        } else if (s[i] == ')') {
            while (sv.size() >= 2 && !sc.empty() && sc.top() != '(') {
                int v1 = sv.top();
                sv.pop();
                int v2 = sv.top();
                sv.pop();
                char op = sc.top();
                sc.pop();
                int ans = apply(v2, v1, op);
                sv.push(ans);
            }
            if (sc.empty() != 1 && sc.top() == '(') {
                sc.pop();
            }
        } else {
            while (sv.size() >= 2 && sc.empty() != 1 && prioritate(sc.top()) >= prioritate(s[i])) {
                int v1 = sv.top();
                sv.pop();
                int v2 = sv.top();
                sv.pop();
                char op = sc.top();
                sc.pop();
                int ans =  apply(v2, v1, op);
                sv.push(ans);
            }
            sc.push(s[i]);
        }
    }
    
    while (sv.size() >= 2 && sc.empty() != 1) {
        int v1 = sv.top();
        sv.pop();
        int v2 = sv.top();
        sv.pop();
        char op = sc.top();
        sc.pop();
        int ans =  apply(v2, v1, op);
        sv.push(ans);
    }
    return sv.top();
}

int main() {
    
    fin >> s;
    fout << eval(s);
    return 0;
}