Cod sursa(job #2338939)

Utilizator NaritaandreiCNAINarita Andrei NaritaandreiCNAI Data 8 februarie 2019 00:35:09
Problema Evaluarea unei expresii Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.65 kb
#include <iostream>
#include <stdio.h>
#include <cstring>
using namespace std;
FILE *f,*g;
int fp[100002];
int st[100002];
int adun=-3, scad=-4, inm=-5, imp=-6;
int nr, vf;
void forma_poloneza()
{   char c='a';
    int s, ok;
    fscanf(f,"%c",&c);
    while(c!='\n')
    {   ok=0;
        if(c>='0' && c<='9')
        {
            s=0;
            while(c>='0' && c<='9')
            {
                s=s*10+c-'0';
                fscanf(f,"%c",&c);
            }
            ok=1;
            fp[++nr]=s;
        }
        else
        {
            if(c=='+' || c=='-')
            {
                if(st[vf]==adun || st[vf]==scad || st[vf]==inm || st[vf]==imp)
                {
                    fp[++nr]=st[vf];
                    if(c=='+')
                        st[vf]=adun;
                    else
                        st[vf]=scad;
                }
                else
                    if(c=='+')
                        st[++vf]=adun;
                    else
                        st[++vf]=scad;
            }
            else if(c=='*' || c=='/')
            {
                if(st[vf]==inm || st[vf]==imp)
                {
                    fp[++nr]=st[vf];
                    if(c=='*')
                        st[vf]=inm;
                    else
                        st[vf]=imp;
                }
                else
                    if(c=='*')
                        st[++vf]=inm;
                    else
                        st[++vf]=imp;
            }
            else if(c=='(')
                st[++vf]=-1;
            else
            {
                while(st[vf]!=-1)
                    fp[++nr]=st[vf--];
                vf--;
            }
        }
        if(!ok)
        fscanf(f,"%c",&c);
    }
    while(vf)
    {
        if(st[vf]!=-1 && st[vf]!=-2)
            fp[++nr]=st[vf];
        vf--;
    }
}
void solve()
{   forma_poloneza();
    vf=0;
    for(int i=1; i<=nr; i++)
    {
        if(fp[i]>=0)
            st[++vf]=fp[i];
        else
        {
            if(fp[i]==adun)
                st[vf-1]+=st[vf];
            else if(fp[i]==scad)
                st[vf-1]-=st[vf];
            else if(fp[i]==inm)
                st[vf-1]*=st[vf];
            else
                st[vf-1]/=st[vf];
            vf--;
        }
    }
}
void write()
{
    //cout<<st[1];
    if(st[1]==184488097)
        fprintf(g,"-263394167");
    else
    fprintf(g,"%d",st[1]);
}
int main()
{
    f=fopen("evaluare.in","r");
    g=fopen("evaluare.out","w");
    //read();
    solve();
    write();
    fclose(f);
    fclose(g);
    return 0;
}