Cod sursa(job #3273554)

Utilizator Radu_FilipescuFilipescu Radu Radu_Filipescu Data 2 februarie 2025 16:55:46
Problema Evaluarea unei expresii Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 3.23 kb
#include <bits/stdc++.h>

using namespace std;

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

string s;
deque <char> stiva_operatori;
deque <int> stiva_numere;

int operator_priority(char c) {
    if(c == '(' || c == ')')
        return 0;

    if(c == '+' || c == '-')
        return 1;

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

bool is_operator(char c) {
    if(c == '+') return true;
    if(c == '*') return true;
    if(c == '/') return true;
    if(c == '-') return true;
    if(c == '(') return true;
    if(c == ')') return true;

    return false;
}

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

int main()
{
    fin >> s;

    // parcurg stringul care este expresia
    for(int i = 0; i < s.size(); i++) {

        // cazul 1 - s[i] este cifra:
        // parsez numarul si il bag in stiva_numere
        if(isdigit(s[i])) {

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

            stiva_numere.push_back(nr);
            continue;
        }

        // cazul 2 - s[i] == '('
        if(s[i] == '(') {
            stiva_operatori.push_back(s[i]);
            continue;
        }

        // cazul 3 - s[i] == ')'
        if(s[i] == ')') {
            while(stiva_operatori.back() != '(') {
                char opr = stiva_operatori.back();
                stiva_operatori.pop_back();

                int a, b;
                b = stiva_numere.back();
                stiva_numere.pop_back();

                a = stiva_numere.back();
                stiva_numere.pop_back();

                int rezultat = calculeaza(a, b, opr);

                stiva_numere.push_back(rezultat);
            }

            stiva_operatori.pop_back();

            continue;
        }

        // cazul 4 - s[i] este operator
        if(is_operator(s[i])) {
            // cat timp operatorul din varful stivei are prioritate
            // mai mare sau egala cu cel curent fac operatii
            while(stiva_operatori.size() > 0 && operator_priority(stiva_operatori.back()) >= operator_priority(s[i])) {
                char opr = stiva_operatori.back();
                stiva_operatori.pop_back();

                int a, b;
                b = stiva_numere.back();
                stiva_numere.pop_back();

                a = stiva_numere.back();
                stiva_numere.pop_back();

                int rezultat = calculeaza(a, b, opr);

                stiva_numere.push_back(rezultat);
            }

            stiva_operatori.push_back(s[i]);
        }
    }

    while(stiva_operatori.size() > 0) {
        char opr = stiva_operatori.back();
        stiva_operatori.pop_back();

        int a, b;
        b = stiva_numere.back();
        stiva_numere.pop_back();

        a = stiva_numere.back();
        stiva_numere.pop_back();

        int rezultat = calculeaza(a, b, opr);

        stiva_numere.push_back(rezultat);
    }

    fout << stiva_numere.back();


    return 0;
}