Cod sursa(job #319218)

Utilizator alexandru92alexandru alexandru92 Data 30 mai 2009 20:40:41
Problema Evaluarea unei expresii Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.82 kb
/*Dat fiind o  expresie aritmetica corecta sa se evalueze.
Ex: 5*(3+4)/7=35/7=5*/
#include <stdio.h>
#include<cstring>
#include<cstdlib>
#define Nmax 100001
int v[Nmax],a,b;
char expresion[Nmax], form[3*Nmax],rail[Nmax],*s;
inline int priority(char c)
{
    if(c=='(') return 0;
    if(c=='+'||c=='-') return 2;
    if(c=='*'||c=='/') return 3;
    return -1;
}
int main()
{register int n,i,p,lg=-1,lg2=-1;
    freopen("evaluare.in","rt",stdin);
    freopen("evaluare.out","wt",stdout);
    gets(expresion);
    for(n=strlen(expresion),i=0;i<n;++i)
       if(expresion[i]>='0'&&expresion[i]<='9')
         {while((i<n&&expresion[i]>='0'&&expresion[i]<='9')||expresion[i]=='.') form[++lg]=expresion[i++];
          form[++lg]='?'; --i;
         }
       else {
             if('('==expresion[i]) rail[++lg2]=expresion[i];
             else if(')'==expresion[i])
                    {while(lg2>=0&&rail[lg2]!='(') form[++lg]=rail[lg2--];
                     --lg2;
                    }
                  else {p=priority(expresion[i]);
                        while(lg2>=0&&p<=priority(rail[lg2])) form[++lg]=rail[lg2--];
                        rail[++lg2]=expresion[i];
                      }
            }
    while(lg2>=0) form[++lg]=rail[lg2--];
    n=strlen(form);
    for(lg=-1,i=0;i<n;++i)
       if(form[i]>='0'&&form[i]<='9')
       {   v[++lg]=atoi(form+i);
            while(form[i]=='?') ++i;
           //v[++lg]=strtold(form+i,&s);
           //i=s-form;
       }
       else{b=v[lg--]; a=v[lg--];
             switch(form[i])
             {
                 case '+':v[++lg]=a+b;break;
                 case '-':v[++lg]=a-b;break;
                 case '*':v[++lg]=a*b;break;
                 case '/':v[++lg]=a/b;break;
             }
            }
    printf("%d",v[0]);
    return 0;
}