Cod sursa(job #2562506)

Utilizator Teo_1101Mititelu Teodor Teo_1101 Data 29 februarie 2020 15:08:10
Problema Evaluarea unei expresii Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.06 kb
#include <bits/stdc++.h>

using namespace std;

const int NMAX = 100004;

ifstream fin("evaluare.in");
ofstream fout("evaluare.out");

stack < int > S;
char C[NMAX];

int pi = 2000000000, x;
int pl = pi+1;
int m = pi-1;
int sup = pi-2;
int ori = pi+2;

int NR( int &i )
{
    int nr = 0;
    while( C[i] >= '0' && C[i] <= '9' )
    {
        nr = nr*10 + C[i]-'0';
        i++;
    }
    i--;
    return nr;
}

void Evaluare()
{
    int x = S.top();
    S.pop();
    while( S.size() && S.top() != pi )
    {
        if( S.top() == pl )
            S.pop();
        else if( S.top() == m )
        {
            x = -x;
            S.pop();
        }
        else if( S.top() == ori )
        {
            S.pop();
            x = x*S.top();
            S.pop();
        }
        else if( S.top() == sup )
        {
            S.pop();
            x = S.top()/x;
            S.pop();
        }
        else
        {
            x += S.top();
            S.pop();
        }
        //cout << x << '\n';
    }
    if( S.size() )S.pop();
    S.push( x );
}
void Read()
{
    fin >> C;

    for( int i = 0; C[i]; ++i )
    {

        if( C[i] == '(')
            S.push(pi);
        if( C[i] >= '0' && C[i] <= '9' )
        {
            x = NR( i );
            if( S.size() && S.top() == sup )
            {
                S.pop();
                x = S.top()/x;
                S.pop();
            }
            if( S.size() && S.top() == ori )
            {
                S.pop();
                x = S.top()*x;
                S.pop();
            }
            S.push( x );
        }
        if( C[i] == '+')
            S.push( pl );
        if( C[i] == '-')
            S.push( m );
        if( C[i] == '/' )
            S.push( sup );
        if( C[i] == '*' )
            S.push( ori );
        if( C[i] == ')' )
            Evaluare();

        //cout << i << ' ' << S.top() << '\n';
    }
    Evaluare();
    fout << S.top() << '\n';
}
int main()
{
    Read();

    return 0;
}