Cod sursa(job #2349715)

Utilizator dobrandreiAndrei Dobra dobrandrei Data 20 februarie 2019 17:36:49
Problema Evaluarea unei expresii Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.79 kb
#include <stdio.h>
#include <cstring>
using namespace std;
FILE *in,*out;

int adun=-3,scad=-4,inm=-5,imp=-6,vf,k;
int fp[100002],st[100002];

void forma_poloneza(){
    char c;
    c=fgetc(in);
    while(c!='\n'){
        int nr=0;
        if(c>='0' && c<='9'){
            while(c>='0' && c<='9')
                nr=nr*10+c-'0',c=fgetc(in);
            fp[++k]=nr;
        }
        else if(c=='+' || c=='-'){
            if(st[vf]==adun || st[vf]==scad || st[vf]==inm || st[vf]==imp)
                fp[++k]=st[vf];
            else vf++;
            if(c=='+')
                st[vf]=adun;
            else
                st[vf]=scad;
        }
        else if(c=='*' || c=='/'){
            if(st[vf]==inm || st[vf]==imp)
                fp[++k]=st[vf];
            else vf++;
            if(c=='*')
                st[vf]=inm;
            else
                st[vf]=imp;
        }
        else if(c=='(')
            st[++vf]=-1;
        else{
            while(st[vf]!=-1)
                fp[++k]=st[vf--];
            vf--;
        }
        if(!nr)
            c=fgetc(in);
    }
    while(vf){
        if(st[vf]!=-1 && st[vf]!=-2)
            fp[++k]=st[vf];
        vf--;
    }
}

void solve(){
    vf=0;
    for(int i=1;i<=k;i++){
        if(fp[i]>=0)
            st[++vf]=fp[i];
        else{
            vf--;
            if(fp[i]==adun)
                st[vf]+=st[vf+1];
            else if(fp[i]==scad)
                st[vf]-=st[vf+1];
            else if(fp[i]==inm)
                st[vf]*=st[vf+1];
            else
                st[vf]/=st[vf+1];
        }
    }
    fprintf(out,"%d",st[1]);
}
int main(){
    in=fopen("evaluare.in","r");
    out=fopen("evaluare.out","w");
    forma_poloneza();
    solve();
    return 0;
}