Cod sursa(job #1480212)

Utilizator Burbon13Burbon13 Burbon13 Data 2 septembrie 2015 11:28:51
Problema Evaluarea unei expresii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.74 kb
#include <fstream>
#include <string>
using namespace std;

ifstream f("evaluare.in");
ofstream o("evaluare.out");

const int nmx = 100005;

string s;

inline int numar(const int st, const int dr) {
    static int aux;
    aux = 0;
    for(int i = st; i <= dr; ++i) {
        aux *= 10;
        aux += (int)s[i] - 48;
    }
    return aux;
}

void eliminare_paranteze(int &st, int &dr) {
    static int grad;
    static bool ok;
    ok = 1;
    while(ok && s[st] == '(' && s[dr] == ')') {
        grad = 0;
        for(int i = st; i <= dr; ++i)
            if(s[i] == '(')
                ++ grad;
            else if(s[i] == ')') {
                -- grad;
                if(i != dr && not grad) {
                    ok = 0;
                    break;
                }
            }
        if(ok) {
            ++ st;
            -- dr;
        }
    }
}

int eval(int st, int dr) {
    static int parant;
    eliminare_paranteze(st,dr);
    parant = 0;
    for(int i = dr; i >= st; --i) {
        if(s[i] == ')')
            ++ parant;
        else if(s[i] == '(')
            -- parant;
        if(s[i] == '+' && not parant)
            return eval(st,i-1) + eval(i+1,dr);
        else if(s[i] == '-' && not parant)
            return eval(st,i-1) - eval(i+1,dr);
    }
    parant = 0;
    for(int i = dr; i >= st; --i) {
        if(s[i] == ')')
            ++ parant;
        else if(s[i] == '(')
            -- parant;
        if(s[i] == '*' && not parant)
            return eval(st,i-1) * eval(i+1,dr);
        else if(s[i] == '/' && not parant)
            return eval(st,i-1) / eval(i+1,dr);
    }
    return numar(st,dr);
}

int main() {
    f >> s;
    o << eval(0,s.size()-1);
    return 0;
}