Cod sursa(job #3284712)

Utilizator Gabriel_DaescuDaescu Gabriel Florin Gabriel_Daescu Data 12 martie 2025 09:21:34
Problema Evaluarea unei expresii Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.83 kb
#include <fstream>
#include <stack>
#define NMAX 100002
using namespace std;
ifstream  fin("evaluare.in");
ofstream fout("evaluare.out");
char e[NMAX];
stack<int> valori;
stack<char> operatori;

void efectuare_operatii()
{
    int a,b;
    char op;

    a=valori.top();
    valori.pop();
    b=valori.top();
    valori.pop();

    op=operatori.top();
    operatori.pop();

    if(op=='+')
    {
        valori.push(a+b);
    }

    if(op=='-')
    {
        valori.push(a-b);
    }

    if(op=='*')
    {
        valori.push(a*b);
    }

    if(op=='/')
    {
        valori.push(a/b);
    }
}

int prioritate(char ch)
{
    if(ch=='+' || ch=='-')
    {
        return 1;
    }

    if(ch=='*' || ch=='/')
    {
        return 2;
    }

    if(ch=='(')
    {
        return -1;
    }
}

int main()
{
    fin>>e;

    for(int i=0; e[i]; i++)
    {
        if(e[i]>='0' && e[i]<='9')
        {
            int val=0;
            while(e[i] && e[i]>='0' && e[i]<='9')
            {
                val=val*10+(e[i]-'0');
                i++;
            }
            i--;
            valori.push(val);
        }

        if(e[i]=='(')
        {
            operatori.push('(');
        }

        if(e[i]==')')
        {
            while(operatori.top()!='(')
            {
                efectuare_operatii();
            }
            operatori.pop();
        }

        if(e[i]=='+' || e[i]=='-' || e[i]=='*' || e[i]=='/')
        {
            while(!operatori.empty() && prioritate(operatori.top())>=prioritate(e[i]))
            {
               efectuare_operatii();
            }
            operatori.push(e[i]);
        }
    }

    while(!operatori.empty())
    {
        efectuare_operatii();
    }

    fout<< valori.top() << "\n";

    return 0;
}