Cod sursa(job #1853741)

Utilizator cosminmaneaCosmin Manea cosminmanea Data 22 ianuarie 2017 00:17:10
Problema Evaluarea unei expresii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.71 kb
#include<cstdio>
#include<cctype>
#include<cstring>
using namespace std;

char sts[100001],s[100010];
int stn[100001],vfs=-1,vsn=0;

int pr(char op)
{
    if(op=='('||op==')')return 0;
    if(op=='+'||op=='-')return 1;
    if(op=='*'||op=='/')return 2;
    return -1;
}

int main()
{
    FILE *f=fopen("evaluare.in","r");
    s[0]='(';
    fgets(s+1,100009,f);
    int n=strlen(s),sgn,i;
    if(s[n-1]=='\n')s[n--]=0;
    s[n++]=')';s[n]=0;
    stn[0]=0;sgn=1;
    for(i=0;i<n;i++)
    {
        if(isdigit(s[i])){stn[vsn]=stn[vsn]*10+s[i]-'0';continue;}
        else if(isdigit(s[i-1])){
               stn[vsn]*=sgn;
               stn[++vsn]=0;sgn=1;
             }
        if(s[i]=='(') {sts[++vfs]='(';continue;}
        //verific daca s[i] este un semn unar
        if(pr(s[i])==1 && pr(s[i-1])!=-1 && s[i-1]!=')')
        {//deci e vorba de un semn unar
            if(s[i]=='-')sgn=-1;continue;
        }
        if(pr(s[i])>pr(sts[vfs]))
                        {sts[++vfs]=s[i];continue;}
        //deci n-a ramas decit cazul cu calcule
        vsn--;
        while(pr(sts[vfs])>=pr(s[i]))
        {
            if(sts[vfs]=='+')
                {stn[vsn-1]+=stn[vsn];vsn--;}
            else
                if(sts[vfs]=='-')
                {stn[vsn-1]-=stn[vsn];vsn--;}
            else
                if(sts[vfs]=='*')
                {stn[vsn-1]*=stn[vsn];vsn--;}
                else if(sts[vfs]=='/')
                    {stn[vsn-1]/=stn[vsn];vsn--;}
            if(sts[vfs]=='('){vfs--;break;}
            vfs--;
        }
        if(s[i]!=')')sts[++vfs]=s[i];
        stn[++vsn]=0;
    }
    f=fopen("evaluare.out","w");
    fprintf(f,"%d",stn[0]);
    return 0;
}