Cod sursa(job #2157513)

Utilizator savigunFeleaga Dragos-George savigun Data 9 martie 2018 18:05:17
Problema Evaluarea unei expresii Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.42 kb
#include <iostream>
#include <fstream>
#include <stack>
#include <string.h>
using namespace std;

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

int n, pr[256];
char s[100005];
stack<char> op;
stack<int> var;

void calc() {
    char o = op.top(); op.pop();
    int b = var.top(); var.pop();
    int a = var.top(); var.pop();
    int r = 0;
    if (o == '+') {
        r = a + b;
    } else if (o == '-') {
        r = a - b;
    } else if (o == '*') {
        r = a * b;
    } else {
        r = a / b;
    }
    var.push(r);
}

int next_int(int &i) {
    int nr = 0;
    while (i < n && (s[i] >= '0' && s[i] <= '9')) {
        nr = nr * 10 + (s[i] - '0');
        i++;
    }
    if (i == n) i++;
    return nr;
}

int main()
{
    pr['+'] = 1;
    pr['-'] = 1;
    pr['*'] = 2;
    pr['/'] = 2;
    pr['('] = 0;
    pr[')'] = 3;

    in >> s;
    n = strlen(s);
    int i = 0;

    while (i < n) {
        char c = s[i];
        if (c >= '0' && c <= '9') {
            var.push(next_int(i));
            i--;
        } else if (c == '(') {
            op.push(c);
        } else if (c == ')') {
            while (op.top() != '(') calc();
            op.pop();
        } else {
            if (op.size()) if (pr[c] <= pr[op.top()]) calc();
            op.push(c);
        }
        i++;
    }

    while (op.size()) calc();

    out << var.top();

    return 0;
}