Cod sursa(job #2338929)

Utilizator NaritaandreiCNAINarita Andrei NaritaandreiCNAI Data 8 februarie 2019 00:10:29
Problema Evaluarea unei expresii Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.46 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--];
        }
        if(!ok)
        fscanf(f,"%c",&c);
    }
    while(vf)
        fp[++nr]=st[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];
    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;
}