Cod sursa(job #1791691)

Utilizator Al3ks1002Alex Cociorva Al3ks1002 Data 29 octombrie 2016 17:15:03
Problema Evaluarea unei expresii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.12 kb
#include <stdio.h>
#include <bits/stdc++.h>

using namespace std;

#define ll long long
#define ld long double
#define pb push_back
#define mp make_pair
#define pii pair<int, int>
#define pll pair<ll, ll>
#define pdd pair<ld, ld>
#define all(x) (x).begin(), (x).end()
#define fi first
#define se second

template<class T>
class ExpressionEvaluation {
    public:
        ExpressionEvaluation(const string& expression) : expression_(expression) {}

        T Evaluate() {
            pointer_ = expression_.begin();
            return EvaluateExpression();
        }

    private:
        string expression_;
        string::iterator pointer_;

        T EvaluateExpression() {
            T result = EvaluateTerm();

            while (*pointer_ == '+' || *pointer_ == '-') {
                if (*pointer_ == '+') {
                    pointer_++;
                    result += EvaluateTerm();
                } else {
                    pointer_++;
                    result -= EvaluateTerm();
                }
            }

            return result;
        }

        T EvaluateTerm() {
            T result = EvaluateFactor();

            while (*pointer_ == '*' || *pointer_ == '/') {
                if (*pointer_ == '*') {
                    pointer_++;
                    result *= EvaluateFactor();
                } else {
                    pointer_++;
                    result /= EvaluateFactor();
                }
            }

            return result;
        }

        T EvaluateFactor() {
            T result = 0;

            if (*pointer_ == '(') {
                pointer_++;
                result = EvaluateExpression();
                pointer_++;
                return result;
            }

            while (*pointer_ >= '0' && *pointer_ <= '9') {
                result = result * 10 + *pointer_ - '0';
                pointer_++;
            }

            return result;
        }
};

int main() {
    cin.sync_with_stdio(false);

    ifstream cin("evaluare.in");
    ofstream cout("evaluare.out");

    string s;
    cin >> s;

    ExpressionEvaluation<int> expr(s);
    cout << expr.Evaluate() << '\n';

    return 0;
}