Cod sursa(job #2991272)

Utilizator AndreiMLCChesauan Andrei AndreiMLC Data 9 martie 2023 11:17:26
Problema Evaluarea unei expresii Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.89 kb
#include <bits/stdc++.h>

using namespace std;

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

char s[100005];

stack<int>nr;
stack<char>op;

void numere(int i)
{
    if(nr.empty())
    {
       nr.push(s[i] - '0');
    }else if(s[i-1] >= '0' && s[i-1] <='9')
    {
        int cop = nr.top();
        nr.pop();
        cop = cop * 10 + (s[i] - '0');
        nr.push(cop);
    }else{
        nr.push(s[i] - '0');
    }
}

void calcule(int nr1, int nr2)
{
    if(op.top() == '*')
    {
        nr.push(nr1 * nr2);
    }else if(op.top() == '/')
    {
        nr.push(nr2/nr1);
    }else if(op.top() == '+')
    {
        nr.push(nr1+nr2);
    }else{
        nr.push(nr2-nr1);
    }
}

int prior(char a)
{
    if(a == '+' || a == '-')
    {
        return 1;
    }
    if(a == '*' || a == '/')
    {
        return 2;
    }
    return 0;
}
void semne(int i)
{
    if(s[i] == ')')
    {
        while(op.top()!='(')
        {
            int nr1 =nr.top();
            nr.pop();
            int nr2 = nr.top();
            nr.pop();
            calcule(nr1,nr2);
            op.pop();
        }
        op.pop();
    }else{
        if(s[i] == '(')
        {
            op.push(s[i]);
        }else{
            while(prior(s[i]) <= prior(op.top()))
            {
                int nr1 =nr.top();
                nr.pop();
                int nr2 = nr.top();
                nr.pop();
                calcule(nr1,nr2);
                op.pop();
            }
            op.push(s[i]);
        }
    }
}

int main()
{
    f.get(s,100001);
    int lung = strlen(s);
    s[lung] = ')';
    s[lung+1] = NULL;
    op.push('(');
    for(int i=0;i<=lung;i++)
    {
        if(s[i] >= '0' && s[i] <='9')
        {
            numere(i);
        }else{
            semne(i);
        }
    }
    g << nr.top();
    return 0;
}