Cod sursa(job #445982)

Utilizator eudanipEugenie Daniel Posdarascu eudanip Data 24 aprilie 2010 17:11:10
Problema Evaluarea unei expresii Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.97 kb
#include<stdio.h>
#include<string.h>

int nr;
int v[100005],num,smn,val;
char op[100005],s[100005];
int ord[501];

int main ()
{
    int i,c,c1,c2;
    freopen("evaluare.in","r",stdin);
    freopen("evaluare.out","w",stdout);
    c='+';
    ord[c]=4;
    c='-';
    ord[c]=3;
    c='/';
    ord[c]=1;
    c='*';
    ord[c]=2;
    gets(s);
    nr=strlen(s);
    val=1;
    op[1]='(';
    smn=1;
    s[nr]=')';
    op[0]=' ';
    for(i=0;i<=nr;i++)
    {
        if(s[i]>='0' && s[i]<='9')
        {
            v[val]=v[val]*10+s[i]-'0';
            num=1;
            continue;
        }
        if(num)
        {
            val++;
            num=0;
        }
        if(s[i]=='(')
        {
            op[++smn]='(';
            continue;
        }
        if(s[i]!=')')
        {
            c2=s[i];
            val--;
            while(1)
            {
                if(op[smn]=='(')
                    break;
                c1=op[smn];
                if(ord[c2]<=ord[c1])
                    break;
                if(op[smn]=='-')
                    v[val-1]-=v[val];
                if(op[smn]=='*')
                    v[val-1]*=v[val];
                if(op[smn]=='/')
                    v[val-1]/=v[val];
                if(op[smn]=='+')
                    v[val-1]+=v[val];
                val--;
                smn--;
            }
            val++;
            v[val]=0;
            op[++smn]=s[i];
            continue;
        }
        val--;
        while(op[smn]!='(')
        {
            if(op[smn]=='-')
                v[val-1]-=v[val];
            if(op[smn]=='*')
                v[val-1]*=v[val];
            if(op[smn]=='/')
                v[val-1]/=v[val];
            if(op[smn]=='+')
                v[val-1]+=v[val];
            smn--;
            val--;
        }
        smn--;
        val++;
        v[val]=0;
    }
    printf("%d\n",v[1]);
    return 0;
}