Cod sursa(job #3293207)

Utilizator biancalautaruBianca Lautaru biancalautaru Data 10 aprilie 2025 19:18:02
Problema Evaluarea unei expresii Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.82 kb
#include <fstream>
using namespace std;
ifstream fin("evaluare.in");
ofstream fout("evaluare.out");
int st1[100001], pr[256]; // st1 este stiva ce retine operanzii, iar pr retine prioritatile operatorilor
char expr[100001], st2[100001]; // st2 este stiva ce retine parantezele si operatorii

int operatie(int a, char op, int b) {
    if (op == '+')
        return a + b;
    if (op == '-')
        return a - b;
    if (op == '*')
        return a * b;
    return a / b;
}

int main() {
    pr['('] = 0;
    pr['+'] = pr['-'] = 1;
    pr['*'] = pr['/']= 2;
    fin >> expr;
    int vf1 = 0, vf2 = 0;
    for (int i = 0; expr[i] != 0; i++)
        if (expr[i] >= '0' && expr[i] <= '9') {
            int nr = 0;
            while (expr[i] >= '0' && expr[i] <= '9') {
                nr = nr * 10 + expr[i] - '0';
                i++;
            }
            i--;
            st1[++vf1] = nr;
        }
        else
            if (expr[i] == '(')
                st2[++vf2] = '(';
            else
                if (expr[i] == ')') {
                    while (st2[vf2] != '(') {
                        int nr = operatie(st1[vf1-1], st2[vf2], st1[vf1]);
                        vf1 -= 2;
                        vf2--;
                        st1[++vf1] = nr;
                    }
                    vf2--;
                }
                else {
                    while (vf2 > 0 && pr[st2[vf2]] >= pr[expr[i]]) {
                        int nr = operatie(st1[vf1-1], st2[vf2], st1[vf1]);
                        vf1 -= 2;
                        vf2--;
                        st1[++vf1] = nr;
                    }
                    st2[++vf2] = expr[i];
                }
    while (vf2 > 0) {
        int nr = operatie(st1[vf1-1], st2[vf2], st1[vf1]);
        vf1 -= 2;
        vf2--;
        st1[++vf1] = nr;
    }
    fout << st1[vf1];
    return 0;
}