Cod sursa(job #2969631)

Utilizator indianu_talpa_iuteTisca Catalin indianu_talpa_iute Data 23 ianuarie 2023 14:49:07
Problema Evaluarea unei expresii Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.34 kb
#include <bits/stdc++.h>
#define MAXSZ 100000

using namespace std;

ifstream fin("evaluare.in");
ofstream fout("evaluare.out");

char str[MAXSZ + 1];

int semn(int lo, int hi, char s1, char s2) {
    int nr = 0;
    for (int i = hi; i >= lo; i--) {
        if (str[i] == ')')
            nr++;
        if (str[i] == '(')
            nr--;
        if (nr == 0 && (str[i] == s1 || str[i] == s2))
            return i;
    }
    return -1;
}

int numar(int lo, int hi) {
    int result = 0;
    for (int i = lo; i <= hi; i++)
        if (str[i] >= '0' && str[i] <= '9')
            result = result * 10 + str[i] - '0';
    return result;
}

int eval(int lo, int hi) {
    int poz = semn(lo, hi, '+', '-');
    if (poz != -1) {
        int left = eval(lo, poz - 1);
        int right = eval(poz + 1, hi);
        if (str[poz] == '+')
            return left + right;
        else
            return left - right;
    }
    poz = semn(lo, hi, '*', '/');
    if (poz != -1) {
        int left = eval(lo, poz - 1);
        int right = eval(poz + 1, hi);
        if (str[poz] == '*')
            return left * right;
        else
            return left / right;
    }
    if (str[lo] == '(' && str[hi] == ')')
        return eval(lo + 1, hi - 1);
    return numar(lo, hi);
}

int main() {
    fin.getline(str, MAXSZ);
    fout << eval(0, (int) strlen(str) - 1);
    return 0;
}