Cod sursa(job #1466629)

Utilizator zertixMaradin Octavian zertix Data 29 iulie 2015 18:09:00
Problema Evaluarea unei expresii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.74 kb
#include <iostream>
#include <cstdio>
#include <cstring>
#define maxc 100005
using namespace std;

char s[maxc];

int semn(char semn)
{
    if (semn=='+' || semn=='-')
        return 1;
    if (semn=='*' || semn=='/')
        return 2;
    return 3;
}
int calc(int st, int dr)
{
    int nrp,ok;
    while (s[st]=='(' && s[dr]==')')
    {
        ok=1;
        nrp=1;
        for (int i=st+1; i<dr; ++i)
        {
            if (s[i]=='(')
                nrp++;
            if (s[i]==')')
                nrp--;
            if (nrp==0)
            {
                ok=0;
                break;
            }
        }
        if (ok)
            {
                st++;
                dr--;
            }
        else
            break;
    }
    int p=0,minim=3,poz;
    for (int i=dr;i>=st; --i)
    {
        if (s[i]==')')
            p++;

        if (s[i]=='(')
            p--;

        if (semn(s[i]) < minim && p==0)
        {
            minim= semn(s[i]);
            poz=i;
            if (minim==1)
            break;
        }
    }
    if (minim!=3)
    {
        if (s[poz]=='+')
            return calc(st,poz-1)+calc(poz+1,dr);
        if (s[poz]=='-')
            return calc(st,poz-1)-calc(poz+1,dr);
        if (s[poz]=='*')
            return calc(st,poz-1)*calc(poz+1,dr);
        if (s[poz]=='/')
            return calc(st,poz-1)/calc(poz+1,dr);
    }
    else
    {
        int nr=0;

        for (int i=st;i<=dr;i++)
            nr=nr*10+s[i]-'0';

        return nr;
    }
}
int main()
{
    freopen("evaluare.in","r",stdin);
    freopen("evaluare.out","w",stdout);
    cin.getline(s,maxc);
    int l=strlen(s);
    printf("%d",calc(0,l-1));
    return 0;
}