Cod sursa(job #2847702)

Utilizator SlavicGGuzun Veaceslav SlavicG Data 11 februarie 2022 11:53:40
Problema Evaluarea unei expresii Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.45 kb
#include "bits/stdc++.h"
using namespace std;

#define ll long long
 
#define       forn(i,n)              for(int i=0;i<n;i++)
#define          all(v)              v.begin(), v.end()
#define         rall(v)              v.rbegin(),v.rend()
 
#define            pb                push_back
#define          sz(a)               (int)a.size()

string s;
int n, i;

int calc();
int prior1();
int prior2();

int calc() {
    int ans = prior1();
    while(i < n && s[i] == '+' || s[i] == '-') {
        if(s[i] == '+') {
            ++i;
            ans += prior1();
        } else {
            ++i;
            ans -= prior1();
        }
    }
    return ans;
}

int prior1() {
    int ans = prior2();
    while(i < n && s[i] == '*' || s[i] == '/') {
        if(s[i] == '*') {
            ++i;
            ans *= prior2();
        } else {
            ++i;
            ans /= prior2();
        }
    }
    return ans;
}

int prior2() {
    int ans = 0;
    if(s[i] == '(') {
        ++i;
        ans = calc();
        ++i;
    } else {
        while(i < n && s[i] >= '0' && s[i] <= '9') {
            ans = ans * 10 + (s[i] - '0');
            ++i;
        }
    }
    return ans;
}

void solve() { 
    freopen("evaluare.in", "r", stdin);
    freopen("evaluare.out", "w", stdout);
    cin >> s;
    n = sz(s);   
    cout << calc();
} 

int32_t main() {
    ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    int t = 1;
    //cin >> t;
    while(t--) {
        solve();
    }
}