Cod sursa(job #1517706)

Utilizator vancea.catalincatalin vancea.catalin Data 4 noiembrie 2015 18:38:28
Problema Evaluarea unei expresii Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.61 kb
#include<iostream>
#include<fstream>
#include<cmath>
#include<string>
#include<cctype>
#define m 2000000000
using namespace std;
fstream fin("evaluare.in",ios::in),fout("evaluare.out",ios::out);
string s;
int x[10000],p[10000];
int numar(int&i)
{
    int aux=0;
    while(isdigit(s[i]))
    {
        aux=aux*10+(s[i]-'0');
        i++;
    }
    i--;
    return aux;
}
int search(int start,int stop)
{
    int i,minim=m,pmin;
    for(i=start;i<=stop;i++)
    {
        if(p[i]<minim)
        {
            minim=p[i];
            pmin=i;
        }
    }
    return pmin;
}
int calc(int a,int c,int b)
{
    if(c==m+1) return a+b;//+
    if(c==m+2) return a-b;//-
    if(c==m+3) return a*b;//*
    if(c==m+4) return a/b;// /
    if(c==m+5) return pow(a,b);//^
}
int rec(int start,int stop)
{
    int a,b,c;
    if(start<stop)
    {
        c=search(start,stop);
        a=rec(start,c-1);
        b=rec(c+1,stop);
        return calc(a,x[c],b);
    }
    else
    {
        return x[start];
    }
}
int main()
{
    int i,adaos=0,siz,grad1=1,grad2=10,grad3=100,gradn=10000,lx=0;
    fin>>s;
    siz=s.size();
    for(i=0;i<siz;i++)
    {
        if(s[i]=='(') adaos+=100;
        if(s[i]==')') adaos-=100;
        if(s[i]=='+') x[lx]=m+1,p[lx++]=grad1+adaos;
        if(s[i]=='-') x[lx]=m+2,p[lx++]=grad1+adaos;
        if(s[i]=='*') x[lx]=m+3,p[lx++]=grad2+adaos;
        if(s[i]=='/') x[lx]=m+4,p[lx++]=grad2+adaos;
        if(s[i]=='^') x[lx]=m+5,p[lx++]=grad3+adaos;
        if(isdigit(s[i])) x[lx]=numar(i),p[lx++]=gradn;
    }
    fout<<rec(0,lx-1);
    return 0;
}