Cod sursa(job #238912)

Utilizator stef2nStefan Istrate stef2n Data 3 ianuarie 2009 17:14:10
Problema Evaluarea unei expresii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.55 kb
#include <cstring>
#include <stack>
#include <fstream>
using namespace std;

const int MAX_N = 100005;

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

int N;
char s[MAX_N];
stack <int> Stack;
int Pair[MAX_N];

int evaluate(int, int);

int factor(int &p, int hi) {
    int answer;
    if(s[p] == '(') {
        answer = evaluate(p + 1, Pair[p] - 1);
        p = Pair[p] + 1;
    }
    else {
        answer = 0;
        while(p <= hi && s[p] >= '0' && s[p] <= '9')
            answer = answer * 10 + (s[p++] - '0');
    }
    return answer;
}

int termen(int &p, int hi) {
    int answer;
    bool the_end = false;
    for(answer = factor(p, hi); p <= hi && !the_end; )
        switch(s[p]) {
            case '*':
                ++p;
                answer *= factor(p, hi);
                break;
            case '/':
                ++p;
                answer /= factor(p, hi);
                break;
            default:
                the_end = true;
        }
    return answer;
}

int evaluate(int lo, int hi) {
    int answer, p = lo;
    for(answer = termen(p, hi); p <= hi; )
        if(s[p++] == '+')
            answer += termen(p, hi);
        else
            answer -= termen(p, hi);
    return answer;
}

int main() {
    in >> s;
    N = strlen(s);
    for(int i = 0; i < N; ++i)
        if(s[i] == '(')
            Stack.push(i);
        else if(s[i] == ')') {
            Pair[Stack.top()] = i;
            Stack.pop();
        }
    out << evaluate(0, N - 1);
    return 0;
}