Cod sursa(job #3000546)

Utilizator racoltaRacolta Victor racolta Data 12 martie 2023 16:12:07
Problema Evaluarea unei expresii Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.99 kb
#include <iostream>
#include <fstream>
#include <stack>
#include <cstring>

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

char expresie[100002];
stack<int> nr;
stack<char> op;

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

int operatii(int nr1, int nr2, int opr)
{
    if (opr == '+')
    {
        return nr1 + nr2;
    }
    if (opr == '-')
    {
        return nr2 - nr1;
    }
    if (opr == '*')
    {
        return nr1 * nr2;
    }
    if (opr == '/')
    {
        return nr2 / nr1;
    }
}

void solveopr()
{
    char opr = op.top();
    op.pop();

    int nr1 = nr.top();
    nr.pop();
    int nr2 = nr.top();
    nr.pop();
        
    int res = operatii(nr1, nr2, opr);

    nr.push(res);
}

void solveparanteze()
{
    while (op.top() != '(')
    {
        solveopr();
    }
    op.pop();
}

int main()
{
    f >> expresie;
    int len = strlen(expresie);
    expresie[len] = ')';
    expresie[len + 1] = NULL;

    op.push('(');
    for (int i = 0; i <= len; i++)
    {
        if (expresie[i] == '(')
        {
            op.push(expresie[i]);
        }
        else if (expresie[i] == ')')
        {
            solveparanteze();
        }
        else if (isdigit(expresie[i]))
        {
            if (i > 0 && isdigit(expresie[i-1]))
            {
                int st = nr.top();
                nr.pop();

                int numar = st * 10 + (expresie[i] - '0');
                nr.push(numar);
            }
            else
            {
                nr.push(expresie[i] - '0');
            }
        }
        else
        {
            while (prioritate(expresie[i]) <= prioritate(op.top()))
            {
                solveopr();
            }
            op.push(expresie[i]);
        }
    }
    g << nr.top();

    return 0;
}