Cod sursa(job #228148)

Utilizator taloibogdanTaloi Bogdan Cristian taloibogdan Data 6 decembrie 2008 16:21:56
Problema Evaluarea unei expresii Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.46 kb
#include<stdio.h>
#include<string.h>
#define paranteza 2000000000
#define plus 1000001000
#define minus 1000001001
#define ori 1000002000
#define supra 1000002001
long m,i,st[100010],a[100010],l=1,n;
char s[100010];
int main()
{
 freopen("evaluare.in","r",stdin);
 freopen("evaluare.out","w",stdout);
 gets(s);
 m=strlen(s);
 for(i=0;i<m;++i)
    {if(s[i]>='0'&&s[i]<='9'){if(i)if(s[i-1]<'0'||s[i-1]>'9')++l;a[l]=a[l]*10+s[i]-'0';}
     if(s[i]=='(')st[++n]=paranteza;
     if(s[i]==')')
       {while(st[n]!=paranteza)
         {a[++l]=st[n];
          --n;}
        --n;}
     if(s[i]=='+')
       {while(st[n]/1000>=plus/1000&&st[n]!=paranteza&&n)
         {a[++l]=st[n];
         --n;}
       st[++n]=plus;}
     if(s[i]=='-')
       {while(st[n]/1000>=minus/1000&&st[n]!=paranteza&&n)
         {a[++l]=st[n];
         --n;}
       st[++n]=minus;}
     if(s[i]=='*')
       {while(st[n]/1000>=ori/1000&&st[n]!=paranteza&&n)
         {a[++l]=st[n];
         --n;}
       st[++n]=ori;}
     if(s[i]=='/')
       {while(st[n]/1000>=supra/1000&&st[n]!=paranteza&&n)
         {a[++l]=st[n];
         --n;}
       st[++n]=supra;}
    }
 while(n)a[++l]=st[n--];
 for(i=1;i<=l;++i)
    {
     if(a[i]<=1000000)st[++n]=a[i];
     if(a[i]==plus)st[n-1]=st[n-1]+st[n--];
     if(a[i]==minus)st[n-1]=st[n-1]-st[n--];
     if(a[i]==ori)st[n-1]=st[n-1]*st[n--];
     if(a[i]==supra)st[n-1]=st[n-1]/st[n--];
    }
 printf("%ld\n",st[1]);
 return 0;
}