Cod sursa(job #1465301)

Utilizator doruliqueDoru MODRISAN dorulique Data 26 iulie 2015 22:52:40
Problema Evaluarea unei expresii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.14 kb
#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;

#define vmax 100001

int stv[vmax],vfsv=-1,vfso=-1,pr[256];
char sto[vmax];

int main()
{
    char s[vmax+2];
    fstream f("evaluare.in",ios::in);
    f.getline(s+1,vmax);
    s[0]='(';strcat(s,")");
    int i,o1,o2,rez;
    for(i=0;i<256;i++)pr[i]=-1;
    pr['(']=0;
    pr['+']=pr['-']=1;
    pr['*']=pr['/']=pr['*']=2;
    char op,opi;
    int n=strlen(s);
    for(i=0;i<n;i++)
    {
        if(s[i]=='(')sto[++vfso]='(';
        else
        if(s[i]>='0'&&s[i]<='9')
            if(s[i-1]<'0'||s[i-1]>'9')
                        stv[++vfsv]=s[i]-'0';
            else
                stv[vfsv]=stv[vfsv]*10+s[i]-'0';
        else
        {
            if(s[i]==')')
            {
                while(sto[vfso]!='(')
                        {
                            o1=stv[vfsv-1],o2=stv[vfsv];
                            op=sto[vfso];
                            if(op=='/')rez=o1/o2;
                            else if(op=='*')rez=o1*o2;
                            else if(op=='%')rez=o1%o2;
                            else if(op=='-')rez=o1-o2;
                            else if(op=='+')rez=o1+o2;
                            vfsv--;stv[vfsv]=rez;
                            vfso--;
                        }
                vfso--;
            }
            else
                {
                    char opi=s[i];
                    while(pr[opi]<=pr[sto[vfso]])
                    {
                            o1=stv[vfsv-1],o2=stv[vfsv];
                            op=sto[vfso];
                            if(op=='/')rez=o1/o2;
                            else if(op=='*')rez=o1*o2;
                            else if(op=='%')rez=o1%o2;
                            else if(op=='-')rez=o1-o2;
                            else if(op=='+')rez=o1+o2;
                            vfsv--;stv[vfsv]=rez;
                            vfso--;
                    }
                    sto[++vfso]=opi;
                }
        }
    }
    f.close();
    f.open("evaluare.out",ios::out);
    f<<stv[0];
    return 0;
}