Cod sursa(job #893938)

Utilizator cat_red20Vasile Ioana cat_red20 Data 26 februarie 2013 18:52:32
Problema Evaluarea unei expresii Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 2.01 kb
#include<stdio.h>
#include<string.h>
#define NMAX 100000
int stNr[NMAX],prior[256],l,uOp,uNr;
char stOp[NMAX],s[NMAX+2];

void initializare()
{
    prior[')']=1;
    prior['+']=prior['-']=2;
    prior['*']=prior['/']=3;
}

void citire()
{
    freopen("evaluare.in","r",stdin);
    scanf("%s",s);
    l=strlen(s);
}


int efectuare(int x,int y,char op)
{
    switch(op)
    {
        case '+': return x+y;
        case '-': return x-y;
        case '*': return x*y;
        case '/': return x/y;
    }
}

void eval()
{
    int x=0,p=1;
    for(int i=l-1;i>=0;i--)
    {
        if(s[i]<='9' && s[i]>='0')
        {
            x=x+(s[i]-'0')*p;
            p=p*10;
        }
        else
        {
            if(s[i]!='(')
            {
               if(s[i]!=')')
               {
                 if(p!=1)
                 {
                   stNr[++uNr]=x;
                   x=0;
                   p=1;
                 }

                while(prior[s[i]]<prior[stOp[uOp]] && uOp>0 && uNr>0)
               {
                   stNr[uNr-1]=efectuare(stNr[uNr],stNr[uNr-1],stOp[uOp]);
                   uNr--;
                   uOp--;
               }
               }
               stOp[++uOp]=s[i];
            }
            if(s[i]=='(')
            {
                   stNr[++uNr]=x;
                   x=0;
                   p=1;
                   while(stOp[uOp]!=')' && uOp>0 && uNr>0)
                   {
                        stNr[uNr-1]=efectuare(stNr[uNr],stNr[uNr-1],stOp[uOp]);
                        uNr--;
                        uOp--;
                   }
                   uOp--;
            }
        }
    }
    while(uOp!=0 && uNr!=0)
    {
         stNr[uNr-1]=efectuare(stNr[uNr],stNr[uNr-1],stOp[uOp]);
         uNr--;
         uOp--;
    }
}

void afisare()
{
    freopen("evaluare.out","w",stdout);
    printf("%d",stNr[1]);
}

int main()
{
    initializare();
    citire();
    eval();
    afisare();
    return 0;
}