Cod sursa(job #1012393)

Utilizator timicsIoana Tamas timics Data 18 octombrie 2013 21:38:36
Problema Evaluarea unei expresii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.87 kb
#include<stdio.h>
#include<string.h>
using namespace std;

char s[100100];
int p[100100],r[100100];
int l,k,i,last,rez;

void transterm();
void transexp();

void transfactor()
{
    if(s[i]=='(')
    {
        ++i;
        transexp();
        ++i;
        return;
    }

    int x=0;

    while(s[i]>='0' && s[i]<='9')
    {
        x = x*10 + s[i] - '0';
        ++i;
    }

    p[k++]=x;

}

void transterm()
{
    transfactor();
    while (i<l && (s[i]=='*' || s[i]=='/'))
    {
        char c=s[i];
        ++i;
        transfactor();
        p[k++]=c+1000000000;
    }
}

void transexp()
{
    transterm();
    while (i<l && s[i]=='+' || s[i]=='-')
    {
        char c=s[i];
        ++i;
        transterm();
        p[k++]=c+1000000000;
    }
}

int main()
{
    freopen("evaluare.in","r",stdin);
    freopen("evaluare.out","w",stdout);

    scanf("%s",s);
    l=strlen(s);

    transexp();

    /*for(i=0;i<k;++i)
        printf("%d ",p[i]);*/

    i=0;

    while(i<k || last>1)
    {
        //printf("%d\n",last);
        if(i<k)
            r[++last]=p[i];

        if(r[last]>1000000000)
        {
            if(r[last-1]<=1000000000 && r[last-2]<=1000000000)
            {
                char c = r[last]-1000000000;
                if(c=='+')
                {
                    rez=r[last-1]+r[last-2];
                }
                else if(c=='-')
                {
                    rez=r[last-2]-r[last-1];
                }
                else if(c=='*')
                {
                    rez=r[last-1]*r[last-2];
                }
                else
                {
                    rez=r[last-2]/r[last-1];
                }

                last-=2;
                r[last]=rez;
            }
        }

        ++i;
    }

    printf("%d",rez);
    return 0;
}