Cod sursa(job #1050953)

Utilizator DanyPrvPirvoaica Daniel DanyPrv Data 9 decembrie 2013 15:00:39
Problema Evaluarea unei expresii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.62 kb
#include <fstream>
#include <string.h>
using namespace std;
ifstream f("evaluare.in");
ofstream g("evaluare.out");
char s[100001],a[100001];
int b[100001],vf1,vf2,nr,ok,i,pr[256],n;
void calcul(){
    char ch;
    int rez;
    ch=a[vf1];
    switch(ch){
        case'+':rez=b[vf2-1]+b[vf2];break;
        case'-':rez=b[vf2-1]-b[vf2];break;
        case'*':rez=b[vf2-1]*b[vf2];break;
        case'/':rez=b[vf2-1]/b[vf2];break;
    }
    vf2--;
    vf1--;
    b[vf2]=rez;
}
int main()
{
    f>>s;
    pr['(']=1;
    pr['+']=pr['-']=2;
    pr['*']=pr['/']=3;
    nr=0;
    ok=0;
    n=strlen(s);
    for(i=0;i<n;i++){
        if(s[i]=='('){
            vf1++;
            a[vf1]=s[i];
        }
        else
            if(s[i]==')'){
                if(ok==1){
                    vf2++;
                    b[vf2]=nr;
                    nr=ok=0;
                }
                while(a[vf1]!='('){
                      calcul();
                }
                vf1--;
            }
            else
                if(s[i]>='0'&&s[i]<='9'){
                    ok=1;
                    nr=nr*10+s[i]-'0';
                }
                else{
                    if(ok==1){
                    vf2++;
                    b[vf2]=nr;
                    nr=ok=0;
                    }
                    while(vf1>0&&pr[s[i]]<=pr[a[vf1]])
                        calcul();
                    vf1++;
                    a[vf1]=s[i];
                }

    }
    if(ok==1){
        vf2++;
        b[vf2]=nr;
    }
    while(vf1>0)
        calcul();
    g<<b[1];
    return 0;
}