Cod sursa(job #567534)

Utilizator Sm3USmeu Rares Sm3U Data 30 martie 2011 10:05:00
Problema Evaluarea unei expresii Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 2.03 kb
#include <stdio.h>
#include <string.h>

using namespace std;

char a[100100];
int b[100100];
int n;
int k;

void citire()
{
    gets(a);
    n=strlen(a);
    a[n]=')';
    n++;
    for(int i=0;i<100010;++i)
        b[i]=1;
}

int rez(int &i)
{
    int inceput=k;
    for(;i<n;)
    {
        if(a[i]=='(')
        {
            b[k++]*=rez(++i);
            i++;
            k++;

        }
        else
        if(a[i]==')')
        {
            int s=0;
            --k;
            for(;inceput<=k;--k)
            {
                s+=b[k];
                b[k]=1;
            }
            return s;
        }
        else
        if(a[i]>='0' && a[i]<='9')
        {
            int x;
            sscanf(a+i,"%d",&x);
            for(;a[i]>='0' && a[i]<='9';++i);
            b[k++]*=x;

        }
        if(a[i]=='+' || a[i]=='-' )
        {
            int x;
            int semn=1;
            if(a[i]=='-')
                semn*=-1;
            i++;
            if(a[i]=='(')
            {
                x=rez(++i);
                i++;
                k++;
            }
            else
            {
                sscanf(a+i,"%d",&x);
                for(;a[i]>='0' && a[i]<='9';++i);
            }
            b[k++]=x*semn;
            //for(;a[i]>='0' && a[i]<='9';++i);
           // b[k++]=x;
        }
        else
        if(a[i]=='*' || a[i]=='/')
        {
            char c=a[i];
            ++i;
            int x;
            if(a[i]=='(')
            {
                x=rez(++i);
                i++;
                k++;
            }
            else
            {
            sscanf(a+i,"%d",&x);
            for(;a[i]>='0' && a[i]<='9';++i);
            }
            if(c=='*')
                b[k-1]*=x;
            else
                b[k-1]/=x;

        }
    }
}

int main()
{
    freopen("evaluare.in","r",stdin);
    freopen("evaluare.out","w",stdout);
    citire();
    int i=0;
    printf("%d",rez(i));

    return 0;
}