Cod sursa(job #2285202)

Utilizator YetoAdrian Tonica Yeto Data 18 noiembrie 2018 12:05:39
Problema Evaluarea unei expresii Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.56 kb
#include <fstream>
using namespace std;
char s[100001];
int nr, k1, k2, rez, i, pr[300];
char st1[100001]; int st2[100001];
ifstream fin ("evaluare.in");
ofstream fout ("evaluare.out");

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

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


        else {
            while (k1>0 && pr[ st1[k1] ] >= pr[s[i]]) {
                rez=operatie(st1[k1], st2[k2-1], st2[k2]);
                k1--; k2--;
                st2[k2]=rez;
            }
            st1[++k1]=s[i];
        }
    }
    while (k1>0) {
        rez=operatie(st1[k1], st2[k2-1], st2[k2]);
        k1--; k2--;
        st2[k2]=rez;
    }
    fout<<st2[1];
    return 0;
}