Cod sursa(job #1153914)

Utilizator span7aRazvan span7a Data 25 martie 2014 20:38:08
Problema Evaluarea unei expresii Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.32 kb
#include<cstdio>
#include<cstring>
#include<algorithm>
#define M -2000000000
using namespace std;
FILE *f=fopen("evaluare.in","r");
FILE *g=fopen("evaluare.out","w");
char a[100002],aux[100002];
int i,p,v[100002],val[100002],k,nr,kk;
int valoare(int a,char c,int b)
{
    if(c=='+') return a+b;
    if(c=='/') return a/b;
    if(c=='*') return a*b;
    if(c=='-') return a-b;
}
int construire()
{
    int poz,j;
    while(1)
    {
    poz=max_element(v+1,v+k+1)-v;
    if(v[poz]==M)return *max_element(val+1,val+k+1);
    i=poz;
    while(val[i]==M&&i>=1)i--;
    j=poz;
    while(val[j]==M&&j<=k)j++;

    val[poz]=valoare(val[i],aux[poz],val[j]);
    v[poz]=M;
    val[i]=M;
    val[j]=M;
    }
}
int main()
{
    fscanf(f,"%s",a);
    for(i=1;i<=strlen(a);i++)val[i]=M;
    for(i=0;i<strlen(a);i++)
    {
        if(a[i]=='-'||a[i]=='+'){v[++k]=p+1;aux[k]=a[i];}
        if(a[i]=='*'||a[i]=='/'){v[++k]=p+2;aux[k]=a[i];}
        if(a[i]=='('){p+=3;v[++k]=M;}
        if(a[i]==')'){p-=3;v[++k]=M;}
        if('0'<=a[i]&&a[i]<='9')
        {
            nr=0;
            while('0'<=a[i]&&a[i]<='9')
            {
                nr=nr*10+a[i]-'0';i++;
            }
            i--;
            v[++k]=M;
            val[k]=nr;
        }
    }
    fprintf(g,"%d",construire());
    return 0;
}