Cod sursa(job #2941863)

Utilizator dragos1102Dragos Vieru dragos1102 Data 18 noiembrie 2022 14:36:12
Problema Evaluarea unei expresii Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.09 kb
#include <fstream>
using namespace std;
ifstream fin("evaluare.in");
ofstream fout("evaluare.out");

int stivanr[100005];
char stivaop[100005];
char s[100005];
int knr,kop;

int prior[256];


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

}

int main()
{

    prior['(']=0;
    prior['+']=1;
    prior['-']=1;
    prior['*']=2;
    prior['/']=2;
    fin>>s;
    for(int i=0; s[i]!='\0'; i++)
    {
        if(s[i]=='(')
            stivaop[++kop]='(';
        else
        {
            if(s[i]==')')
            {
                while(stivaop[kop]!='(')
                {
                    char op=stivaop[kop];
                    int a=stivanr[knr-1],b=stivanr[knr];
                    int rez=evaluare(a,b,op);
                    kop--;
                    knr--;
                    stivanr[knr]=rez;
                }
                kop--;  /// elimin paranteza deschisa

            }
            else if(s[i]=='+'|| s[i]=='-' || s[i]=='*'|| s[i]=='/')
            {
                while(kop>0&&prior[s[i]]<=prior[stivaop[kop]])
                {
                    char op=stivaop[kop];
                    int a=stivanr[knr-1],b=stivanr[knr];
                    int rez=evaluare(a,b,op);
                    kop--;
                    knr--;
                    stivanr[knr]=rez;
                }
                stivaop[++kop]=s[i];

            }
            else  /// s[i]=cifra
            {
                int nr=0;
                while(s[i]>='0'&&s[i]<='9')
                {
                    nr=nr*10+s[i]-'0';
                    i++;
                }
                stivanr[++knr]=nr;
                i--;
            }

        }

    }
    while(kop>0)
    {
        char op=stivaop[kop];
        int a=stivanr[knr-1],b=stivanr[knr];
        int rez=evaluare(a,b,op);
        kop--;
        knr--;
        stivanr[knr]=rez;
    }
    fout<<stivanr[1];
}