Cod sursa(job #3137084)

Utilizator AlexanderCernyCernaianu Alexandru AlexanderCerny Data 11 iunie 2023 11:10:51
Problema Evaluarea unei expresii Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.81 kb
#include <fstream>

using namespace std;

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

char expr[100002];
int op[100001],k1,k2;
char semn[100001],pr[256];
int calcul(char op,int x,int y)
{
    switch(op){
        case '+':
            return x+y;
        case '-':
            return x-y;
        case '*':
            return x*y;
        case '/':
            return x/y;
    }

}
int main()
{
    fin>>expr;
    pr['+']=pr['-']=1;
    pr['*']=pr['/']=2;
    for(int i=0;expr[i]!=0;i++)
    {
        if(expr[i]==('('))
            semn[++k1]=expr[i];
        else
            if(expr[i]>='0' && expr[i]<='9')
            {
                int nr=0;
                while(expr[i]>='0' && expr[i]<='9')
                {
                    nr=nr*10+expr[i]-'0';
                    i++;
                }
                op[++k2]=nr;
                i--;
            }
            else
                if(expr[i]==')')
                {
                    while(semn[k1]!='(')
                    {
                        int rez=calcul(semn[k1],op[k2-1],op[k2]);
                        k1--;
                        k2--;
                        op[k2]=rez;
                    }
                    k1--;
                }
                else
                {
                    while(k1>0&&pr[expr[i]]<=pr[semn[k1]])
                    {
                        int rez=calcul(semn[k1],op[k2-1],op[k2]);
                        k1--;
                        k2--;
                        op[k2]=rez;
                    }
                    semn[++k1]=expr[i];
                }
    }
    while(k1>0)
    {
        int rez=calcul(semn[k1],op[k2-1],op[k2]);
        k1--;
        k2--;
        op[k2]=rez;
    }
    fout<<op[1];
    return 0;
}