Cod sursa(job #1153946)

Utilizator span7aRazvan span7a Data 25 martie 2014 21:10:36
Problema Evaluarea unei expresii Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.54 kb
#include<cstdio>
#include<cstring>
#include<algorithm>
#define M -2000000000
#include<queue>
using namespace std;
FILE *f=fopen("evaluare.in","r");
FILE *g=fopen("evaluare.out","w");
char a[100002],aux[100002],c;
struct kkt
{
    int pr;
    int pozz;
}auxx;
struct cmp
{
    bool operator() (kkt a,kkt b)
    {
        return a.pr<b.pr;
    }
};
priority_queue<kkt,vector<kkt>,cmp>v;
int i,p,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(!v.empty())
    {
    poz=v.top().pozz;
    v.pop();
    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]);
    val[i]=M;
    val[j]=M;
    }
    return *max_element(val+1,val+k+1);
}
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]=='+'){kkt auxx;auxx.pozz=++k;auxx.pr=p+1;v.push(auxx);aux[k]=a[i];}
    if(a[i]=='*'||a[i]=='/'){kkt auxx;auxx.pozz=++k;auxx.pr=p+2;v.push(auxx);aux[k]=a[i];}
    if(a[i]=='('){p+=3;++k;}
    if(a[i]==')'){p-=3;++k;}
    if('0'<=a[i]&&a[i]<='9')
        {
            nr=0;
            while('0'<=a[i]&&a[i]<='9')
            {
                nr=nr*10+a[i]-'0';i++;
            }
            i--;
            ++k;
            val[k]=nr;
        }

    }
    fprintf(g,"%d",construire());
    return 0;
}