Cod sursa(job #2713852)

Utilizator NanuGrancea Alexandru Nanu Data 28 februarie 2021 19:22:23
Problema Evaluarea unei expresii Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.53 kb
#include <fstream>
#include <stack>
#include <cstring>

using namespace std;

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

#define DIM 100005

char s[DIM];
int fp[DIM], i, nr, lg, q, prioritate[1000], val[1000];
stack <char> st;
stack <int> rez;

static inline bool opr(char ch) {   //daca e operator
    return (ch == '+' || ch == '-' || ch == '*' || ch == '/');
}

int main() {
    cin.getline(s, DIM - 2);
    lg = strlen(s);

    prioritate['*'] = prioritate['/'] = 2;
    prioritate['+'] = prioritate['-'] = 1;
    val['+'] = -1;
    val['-'] = -2;
    val['*'] = -3;
    val['/'] = -4;

    st.push('(');   //santinela
    s[lg] = ')';    //pentru a goli stiva
    nr = -1;

    for(i = 0; i <= lg; i++) {
        if(isdigit(s[i])) {
            if(nr == -1)
                nr = 0; //daca nr era resetat
            nr = nr * 10 + s[i] - '0';

        }else if(nr != -1) {    //daca avem ce adauga
            fp[++q] = nr;
            nr = -1;    //resetam nr
        }

        if(s[i] == '(')
            st.push('(');
        
        if(opr(s[i])) {
            while(prioritate[st.top()] >= prioritate[s[i]]) {   //eliminam semnele cu prioritate mai mare sau egala
                fp[++q] = val[st.top()];
                st.pop();
            }
            st.push(s[i]);  //adaug semnul actual
        }
        if(s[i] == ')') {
            while(st.top() != '(') {    //inchid paranteza
                fp[++q] = val[st.top()];
                st.pop();
            }
            st.pop();
        }
    }

    for(i = 1; i <= q; i++) {
        if(fp[i] == -1) {
            int sum = rez.top();    //adunarea si inmultirea sunt comutative
            rez.pop();
            sum += rez.top();
            rez.pop();
            rez.push(sum);
        }else if(fp[i] == -2) {
            int dif = -1 * rez.top();   //trebuie sa l scad pe cel de jos cu cel actual
            rez.pop();
            dif += rez.top();
            rez.pop();
            rez.push(dif);

        }else if(fp[i] == -3) {
            int prod = rez.top();
            rez.pop();
            prod *= rez.top();
            rez.pop();
            rez.push(prod);
        }else if(fp[i] == -4) {
            int numitor = rez.top();    //impart numarul de jos la cel aactual
            rez.pop();
            int numarator = rez.top();
            rez.pop();
            rez.push(numarator / numitor);
        }else rez.push(fp[i]);

    }

    cout << rez.top();

    return 0;
}