Cod sursa(job #2713859)

Utilizator NanuGrancea Alexandru Nanu Data 28 februarie 2021 19:36:07
Problema Evaluarea unei expresii Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.31 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], a, b;
stack <char> st;
stack <int> rez;

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

static inline void atribuire(int &a, int &b) {  //retin ultimele 2 elemente din stiva
    a = rez.top();
    rez.pop();
    b = rez.top();
    rez.pop();
}

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) {   //daca semnul e +
            atribuire(a, b);
            rez.push(a + b);
        }else if(fp[i] == -2) { //daca semnul e -
            atribuire(a, b);    //scad pe a din b;
            rez.push(b - a);
        }else if(fp[i] == -3) { //daca semnul e *
            atribuire(a, b);
            rez.push(a * b);
        }else if(fp[i] == -4) { //daca semnul e /;
            atribuire(a, b);    //impart b la a;
            rez.push(b / a); 
        }else rez.push(fp[i]);

    cout << rez.top();

    return 0;
}