Cod sursa(job #1483528)

Utilizator adiXMGemene Adrian adiXM Data 9 septembrie 2015 15:44:08
Problema Evaluarea unei expresii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.53 kb
#include<fstream>
#include<stack>
#include<cstring>
#include<vector>
using namespace std;
const int NMAX=100005;
ifstream f("evaluare.in");
ofstream g("evaluare.out");
char s[NMAX];
int poz[NMAX];
stack<int> St;
inline int Solve(const int st,const int dr)
{
    vector < int > v;
    int semn = 1, sol = 0,x = 0;
    for(int i=st;i<=dr;++i)
    {
        if(s[i] == '(')
        {
            x = Solve(i+1,poz[i]-1);
            i = poz[i];
            continue;
        }
        if('0'<= s[i] && s[i]<='9')
        {
            x=x*10+s[i]-'0';
            continue;
        }
        if(semn == 0)
            v.back()*=x;
        else
            if(semn == -2)
                v.back()/=x;
        else
            v.push_back(x*semn);
        if(s[i]=='*')
            semn = 0;
        else
        if(s[i] == '/')
            semn = -2;
        else
        {
            semn = 1;
            if(s[i] =='-')
                semn  = -1;
        }

        x = 0;
    }
    if(semn == 0)
        v.back()*=x;
    else
        if(semn == -2)
            v.back()/=x;
    else
        v.push_back(x*semn);
    sol = 0;
    for(int i=0;i<v.size();++i)
        sol += v[i];
    return sol;
}
int main()
{
    f>>(s+1);
    int n=strlen(s+1);
    for(int i=1;i<=n;i++)
        if(s[i]=='(')
            St.push(i);
        else
            if(s[i]==')')
            {
                poz[St.top()]=i;
                St.pop();
            }
    g<<Solve(1,n)<<"\n";
    return 0;
}