Cod sursa(job #2675685)

Utilizator TudosieRazvanTudosie Marius-Razvan TudosieRazvan Data 22 noiembrie 2020 12:37:15
Problema Evaluarea unei expresii Scor 20
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.64 kb
#include <cstdio>
#include <cstring>
#define NMAX 100000
using namespace std;

int stNum[NMAX+3],vfOp=0,vfNum=0;
char v[NMAX+3],op[NMAX+3];

FILE *fin,*fout;

int calc(int a,int b,char oper)
{
    if(oper=='+')
    {
        return a+b;
    }
    else if(oper=='-')
    {
        return a-b;
    }
    else if(oper=='*')
    {
        return a*b;
    }
    else if(oper=='/')
    {
        return a/b;
    }
}

int oper(char x)
{
    if(x=='+')
    {
        return 1;
    }
    else if(x=='-')
    {
        return 1;
    }
    else if(x=='*')
    {
        return 2;
    }
    else if(x=='/')
    {
        return 2;
    }
    return 0;
}

void afis()
{
    for(int i=1; i<=vfOp; i++)
    {
        fprintf(fout,"%c",op[i]);
    }
    fprintf(fout,"\n");
    for(int i=1; i<=vfNum; i++)
    {
        fprintf(fout,"%d ",stNum[i]);
    }
    fprintf(fout,"\n\n");
}

int main()
{
    fin=fopen("evaluare.in","r");
    fout=fopen("evaluare.out","w");

    fgets(v,NMAX+3,fin);
    int n=strlen(v);
    n--;

    for(int i=0; i<n; i++)
    {
        char ch=v[i];

        if(ch=='(')
        {
            //il pun in stiva de operatori
            vfOp++;
            op[vfOp]=ch;
        }
        else if(ch==')')
        {
            //fprintf(fout,"%c ",ch);
            //elimin din stiva pana cand gasesc '('
            while(op[vfOp]!='(')
            {
                int rez=calc(stNum[vfNum],stNum[vfNum-1],op[vfOp]);
                vfOp--;
                vfNum--;
                stNum[vfNum]=rez;
            }
            vfOp--;
        }
        else
        {
            if(ch>='0' && ch<='9')
            {
                //am cifra aici
                int num=0;
                while(i<=n && v[i]>='0' && v[i]<='9')
                {
                    num=num*10+v[i]-'0';
                    i++;
                }
                i--;
                vfNum++;
                stNum[vfNum]=num;
            }
            else
            {
                //am un operator

                while(vfOp>0 && oper(ch)<=oper(op[vfOp]))
                {
                    int rez=calc(stNum[vfNum],stNum[vfNum-1],op[vfOp]);
                    vfOp--;
                    vfNum--;
                    stNum[vfNum]=rez;
                }
                vfOp++;
                op[vfOp]=ch;
            }
        }
        //afis();
    }

    while(vfOp>0)
    {
        int rez=calc(stNum[vfNum-1],stNum[vfNum],op[vfOp]);
        vfOp--;
        vfNum--;
        stNum[vfNum]=rez;
    }
    fprintf(fout,"%d",stNum[1]);
    return 0;
}