Cod sursa(job #2338411)

Utilizator NaritaandreiCNAINarita Andrei NaritaandreiCNAI Data 7 februarie 2019 14:00:12
Problema Evaluarea unei expresii Scor 20
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 3 kb
#include <iostream>
#include <stdio.h>
#include <cstring>
using namespace std;
FILE *f,*g;
char v[100002];
int st[100002];
int lg,s;
int adun=-3, scad=-4, inm=-5, imp=-6;
void read()
{
    fscanf(f,"%s",&v);
    lg=strlen(v);
}
void solve()
{   int vf=0,nr,s2,j,jcop,vffake,icop;
    for(int i=0; i<lg; i++)
    {
        if(v[i]=='(')
            st[++vf]=-1;
        else if(v[i]>='0' && v[i]<='9')
        {   nr=0;
            while(v[i]>='0' && v[i]<='9')
            {
                nr=nr*10+v[i]-'0';
                i++;
            }
            st[++vf]=nr;
            i--;
        }
        else if(v[i]=='+')
            st[++vf]=adun;
        else if(v[i]=='-')
            st[++vf]=scad;
        else if(v[i]=='*')
            st[++vf]=inm;
        else if(v[i]=='/')
            st[++vf]=imp;
        else
        {
            for(j=vf; st[j]!=-1; j--){}
            vffake=j;
            s=st[++j];
            j++;                                             //aici tre sa vad daca ii cv de forma (-21+3)
            for( ; j<=vf; j+=2)
            {
                if(st[j]==adun && (st[j+2]!=inm && st[j+2]!=imp))
                    s+=st[j+1];
                else if(st[j]==scad && (st[j+2]!=inm && st[j+2]!=imp))
                    s-=st[j+1];
                else
                {   jcop=j;
                    if(st[i]==adun || st[i]==scad)
                        s2=st[i+1],i+=2;
                    else
                        s2=st[i-1];
                    while(st[j]==inm || st[j]==imp)
                    {
                        if(st[j]==inm)
                            s2*=st[j+1];
                        else
                            s2/=st[j+1];
                        j+=2;
                    }
                    if(jcop==scad)
                        s-=s2;
                    else
                        s+=s2;
                }
            }
            vf=vffake;
            st[vffake]=s;
        }
    }
    if(vf<2)
        return;
    s=0;
    st[vf+1]=st[vf+2]=st[vf+3]=0;
    for(int i=2; i<vf; i+=2)
    {
        if(st[i]==adun && st[i+2]!=inm && st[i+2]!=imp)
            s+=st[i+1];
        else if(st[i]==scad && st[i+2]!=inm && st[i+2]!=imp)
            s-=st[i+1];
        else
        {   icop=i;
            if(st[i]==adun || st[i]==scad)
                s2=st[i+1],i+=2;
            else
                s2=st[i-1];
            while(st[i]==inm || st[i]==imp)
            {
                if(st[i]==inm)
                    s2*=st[i+1];
                else
                    s2/=st[i+1];
                i+=2;
            }
            if(icop==scad)
                s-=s2;
            else
                s+=s2;
            i-=2;
        }
    }
}
void write()
{
    fprintf(g,"%d",s);
    cout<<s;
}
int main()
{
    f=fopen("evaluare.in","r");
    g=fopen("evaluare.out","w");
    read();
    solve();
    write();
    fclose(f);
    fclose(g);
    return 0;
}