Cod sursa(job #2870948)

Utilizator FunnyStockyMihnea Andreescu FunnyStocky Data 12 martie 2022 18:50:27
Problema Evaluarea unei expresii Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.65 kb
#include <cstdio>
#include <cstring>
#include <iostream>
#include <cassert>

using namespace std;


const int N=100000+7;
char s[N];
int n;
int p;

int readNum(){
        assert('0'<=s[p]&&s[p]<='9');
        int sol=0;
        while(p<n&&'0'<=s[p]&&s[p]<='9'){
                sol=10*sol+s[p++]-'0';
        }
        return sol;
}

int solve(){
        assert(p<n);
        int sol=1;
        if(s[p]=='('){
                p++;
                sol=solve();
                assert(s[p]==')');
                p++;
        }else{
                sol=readNum();
        }
        while(p<n&&(s[p]=='*'||s[p]=='/')){
                bool is_mul=(s[p++]=='*');
                int cur=1;
                assert(p<n);

                if(s[p]=='('){
                        p++;
                        cur=solve();
                        assert(s[p]==')');
                        p++;
                }else{
                        cur=readNum();
                }
                if(is_mul){
                        sol*=cur;
                }else{
                        sol/=cur;
                }
        }
        if(p<n&&(s[p]=='+'||s[p]=='-')){
                assert(s[p]=='+'||s[p]=='-');
                if(s[p]=='+'){
                        p++;
                        sol+=solve();
                }else{
                        p++;
                        sol-=solve();
                }
        }
        return sol;
}

int main(){
        freopen ("evaluare.in","r",stdin);
        freopen ("evaluare.out","w",stdout);

        scanf("%s",&s);
        n=strlen(s);

        cout<<solve()<<"\n";
}