Cod sursa(job #2870671)

Utilizator SlavicGGuzun Veaceslav SlavicG Data 12 martie 2022 14:55:17
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()

int n, i = 0;
string s;

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();
    }
}