Cod sursa(job #2849205)

Utilizator Irina.comanIrina Coman Irina.coman Data 14 februarie 2022 18:18:47
Problema Evaluarea unei expresii Scor 80
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.27 kb
#include <iostream>
#include <fstream>
#include <cstring>
#include <cctype>
#include <stack>
using namespace std;
stack <char> ops;
stack <int> valori;

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

int operatie(char op, int a, int b)
{
    if (op == '+')
        return a + b;
    else if (op == '-')
        return a - b;
    else if (op == '*')
        return a * b;
    else if (op == '/')
        return a / b;
}

int main()
{
    ifstream fin("evaluare.in");
    ofstream fout("evaluare.out");
    char c[100005], op;
    int val2, val1, val;
    fin.getline(c, 100005);
    for (int i = 0; i < strlen(c); i++)
    {
        if (c[i] == ' ')
            continue;
        else if (c[i] == '(')
            ops.push(c[i]);
        else if (isdigit(c[i]))
        {
            val = 0;
            while (i < strlen(c) and isdigit(c[i]))
            {
                val = val * 10 + (c[i] - '0');
                i++;
            }
            valori.push(val);
            i--;
        }
        else if (c[i] == ')')
        {
            while (!ops.empty() and ops.top() != '(')
            {
                val2 = valori.top();
                valori.pop();
                val1 = valori.top();
                valori.pop();
                op = ops.top();
                ops.pop();
                valori.push(operatie(op, val1, val2));
            }
            if (!ops.empty())
                ops.pop();
        }
        else
        {
            while (!ops.empty() and precedence(ops.top()) >= precedence(c[i]))
            {
                val2 = valori.top();
                valori.pop();
                val1 = valori.top();
                valori.pop();
                op = ops.top();
                ops.pop();
                valori.push(operatie(op, val1, val2));
            }
            ops.push(c[i]);
        }
    }
    while (!ops.empty())
    {
        val2 = valori.top();
        valori.pop();
        val1 = valori.top();
        valori.pop();
        op = ops.top();
        ops.pop();
        valori.push(operatie(op, val1, val2));
    }
    fout << valori.top();
    return 0;
}