Cod sursa(job #3274260)

Utilizator Cristian_NegoitaCristian Negoita Cristian_Negoita Data 5 februarie 2025 21:51:32
Problema Evaluarea unei expresii Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.02 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin("evaluare.in");
ofstream fout("evaluare.out");

int operatie(int a, int b, char op)
{
    switch(op)
    {
        case '+': return a + b;
        case '-': return a - b;
        case '*': return a * b;
        case '/': return a / b;
        //default: return 0;
    }
}

int ordine(char op)
{
    if(op == '+' || op == '-')
        return 1;
    if(op == '*' || op == '/')
        return 2;
    return 0;
}

int eval(string s)
{
    stack<int> nr;
    stack<char> ops;
    for(int i = 0; i < s.size(); i++)
    {
        if(s[i] == ' ') continue;
        if (isdigit(s[i]))
        {
            int val = 0;
            while(i < s.size() && isdigit(s[i]))
                val = 10 * val + (s[i++] - '0');
            nr.push(val);
            i--;
        }
        else if(s[i] == '(')
            ops.push(s[i]);
        else if(s[i] == ')')
        {
            while(!ops.empty() && ops.top() != '(')
            {
                int b = nr.top(); nr.pop();
                int a = nr.top(); nr.pop();
                char op = ops.top(); ops.pop();
                nr.push(operatie(a, b, op));
            }
            ops.pop();
        }
        else if(s[i] == '+' || s[i] == '-' || s[i] == '*' || s[i] == '/')
        {
            while(!ops.empty() && ordine(ops.top()) >= ordine(s[i]))
            {
                int b = nr.top();
                nr.pop();
                int a = nr.top();
                nr.pop();
                char op = ops.top();
                ops.pop();
                nr.push(operatie(a, b, op));
            }
            ops.push(s[i]);
        }
    }

    while(!ops.empty())
    {
        int b = nr.top();
        nr.pop();
        int a = nr.top();
        nr.pop();
        char op = ops.top();
        ops.pop();
        nr.push(operatie(a, b, op));
    }
    return nr.top();
}

signed main()
{
    string s;
    fin >> s;
    fout << eval(s);

    return 0;
}