Cod sursa(job #2669535)

Utilizator George_CristianGeorge Dan-Cristian George_Cristian Data 7 noiembrie 2020 10:53:04
Problema Evaluarea unei expresii Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.1 kb
#include <fstream>
#include <cstring>
#include <stack>

using namespace std;

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

char s[100005];
stack<char> operatori;
stack<int> operanzi;

void evaluare_expresie() {
    while (!operatori.empty() && operatori.top() != '(') {
        int b = operanzi.top();
        operanzi.pop();
        int a = operanzi.top();
        operanzi.pop();
        char op = operatori.top();
        operatori.pop();
        switch (op) {
            case '+':
                operanzi.push(a + b);
                break;
            case '-':
                operanzi.push(a - b);
                break;
            case '*':
                operanzi.push(a * b);
                break;
            case '/':
                operanzi.push(a / b);
                break;
        }
    }
}

int evaluare() {
    int nrl = strlen(s);
    for (int i = 0; i < nrl; ++i) {
        if (s[i] == '(')
            operatori.push('(');
        else if (s[i] == ')') {
            evaluare_expresie();
            operatori.pop();
        } else if (s[i] == '+' || s[i] == '-') {
            evaluare_expresie();
            operatori.push(s[i]);
        } else if (s[i] == '*' || s[i] == '/') {
            char inainte = operanzi.top();
            if (inainte == '+' || inainte == '-')
                operanzi.push(s[i]);
            else {
                if (inainte == '*' || inainte == '/') {
                    int b = operanzi.top();
                    operanzi.pop();
                    int a = operanzi.top();
                    operanzi.pop();
                    if (inainte == '*')
                        operanzi.push(a * b);
                    else
                        operanzi.push(a / b);
                }
                operatori.push(s[i]);
            }
        } else {
            int nr = 0,j;
            for (j = i; j < nrl && isdigit(s[j]); ++j)
                nr = nr * 10 + s[j] - '0';
            operanzi.push(nr);
            i = j - 1;
        }
    }
    evaluare_expresie();
    return operanzi.top();
}

int main() {
    f.getline(s, 100005);
    g << evaluare();
    return 0;
}