Cod sursa(job #2229045)

Utilizator Alex18maiAlex Enache Alex18mai Data 5 august 2018 18:41:59
Problema Evaluarea unei expresii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.18 kb
//ALEX ENACHE

//#include <iostream>
#include <vector>
#include <algorithm>
#include <queue>
#include <map>
#include <set>
#include <unordered_map>
#include <time.h>
#include <iomanip>
#include <deque>
#include <math.h>
#include <cmath>
#include <assert.h>
#include <stack>

using namespace std;

#include <fstream>
ifstream cin ("evaluare.in");
ofstream cout ("evaluare.out");

int conv[300];
vector <int> v;

int pnt = 0;

int rez(){

    vector <int> now;

    while (pnt < v.size() && v[pnt] != conv[')']){
        if (v[pnt] == conv['(']){
            pnt++;
            now.push_back(rez());
        }
        else{
            now.push_back(v[pnt]);
        }
        pnt++;
    }

    vector <int> after;

    for (int i=0; i<now.size(); i++){
        if (now[i] <= 1e9){
            int nr = now[i];
            while (i+1 < now.size() && (now[i+1] == conv['/'] || now[i+1] == conv['*'])){
                if (now[i+1] == conv['/']){
                    nr /= now[i+2];
                }
                else{
                    nr *= now[i+2];
                }
                i+=2;
            }
            after.push_back(nr);
        }
        else{
            after.push_back(now[i]);
        }
    }

    int nr = after[0];

    for (int i=1; i<after.size(); i+=2){
        if (after[i] == conv['+']){
            nr += after[i+1];
        }
        else{
            nr -= after[i+1];
        }
    }

    return nr;

}

int main() {

    ios::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);

    //freopen("input", "r", stdin);
    //freopen("output", "w", stdout);

    string s;
    cin>>s;

    conv['+'] = 1e9+1;
    conv['-'] = 1e9+2;
    conv['/'] = 1e9+3;
    conv['*'] = 1e9+4;
    conv['('] = 1e9+5;
    conv[')'] = 1e9+6;

    for (int i=0; i<s.size(); i++){
        if (s[i] >= '0' && s[i] <= '9'){
            int nr = 0;
            while (i < s.size() && s[i] >= '0' && s[i] <= '9'){
                nr *= 10;
                nr += s[i]-'0';
                i++;
            }
            v.push_back(nr);
        }
        if (i < s.size()){
            v.push_back(conv[s[i]]);
        }
    }

    /*for (auto &x : v){
        cout<<x<<" ";
    }*/

    cout<<rez();

    return 0;
}