Cod sursa(job #1463539)

Utilizator sorynsooSorin Soo sorynsoo Data 21 iulie 2015 10:52:43
Problema Evaluarea unei expresii Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.76 kb
#include <fstream>
#include <string.h>
using namespace std;

#define MAXSIR 100005
#define INF 9999999
ifstream cin("evaluare.in");
ofstream cout("evaluare.out");

char sir[MAXSIR];

int prioritate(char semn)
{
    if(semn=='+' || semn=='-')
        return 1;
    if(semn=='*' || semn=='/')
        return 2;

    return INF;
}

int eval(char expr[], int st, int dr)
{
    if(expr[st]=='(' && expr[dr]==')')
    {
        bool ok=true; int nrp=1;
        for(int i=st+1; i<dr; i++)
        {
            if(expr[i]=='(')
                nrp++;
            if(expr[i]==')')
                nrp--;
            if(!nrp)
            {
                ok=false;
                break;
            }
        }
        if(ok)
          return eval(expr,st+1,dr-1);
    }

    int p=0,minim=INF,p_minim;
    for(int i=dr; i>=st; i--)
    {
        if(expr[i]==')')
            p++;
        if(expr[i]=='(')
            p--;

        if(prioritate(expr[i]) < minim && !p)
        {
            minim = prioritate(expr[i]);
            p_minim=i;
        }
    }
    if(minim!=INF)
    {
        if(expr[p_minim]=='+')
            return eval(expr,st,p_minim-1) + eval(expr,p_minim+1,dr);
        if(expr[p_minim]=='-')
            return eval(expr,st,p_minim-1) - eval(expr,p_minim+1,dr);
        if(expr[p_minim]=='*')
            return eval(expr,st,p_minim-1) * eval(expr,p_minim+1,dr);
        if(expr[p_minim]=='/')
            return eval(expr,st,p_minim-1) / eval(expr,p_minim+1,dr);
    }
    else
    {
        int nr=0;
        for(int i=st; i<=dr; i++)
        {
             nr=nr*10+expr[i]-'0';
        }
        return nr;
    }

}
int main()
{
    cin.getline(sir,MAXSIR);
    cout<<eval(sir,0,strlen(sir)-1);
}