Cod sursa(job #2870267)

Utilizator octavi26octavian octavi26 Data 12 martie 2022 11:19:28
Problema Evaluarea unei expresii Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.5 kb
#include <bits/stdc++.h>
#define N 100008

using namespace std;

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

int n;
char s[N];
map< char, int > prec;


void Citire()
{
    fin >> s + 1;
    n = strlen( s + 1 );
    prec['('] = 0;
    prec[')'] = 0;
    prec['+'] = 1;
    prec['-'] = 1;
    prec['*'] = 2;
    prec['/'] = 2;
}

stack<char> ops;
stack<int> values;

inline int rez( int val1, int val2, char op )
{
    if( op == '+' )
        return val1 + val2;
    if( op == '-' )
        return val1 - val2;
    if( op == '*' )
        return val1 * val2;
    if( op == '/' )
        return val1 / val2;
    return 0;
}

void Rezolvare()
{
    int i;
    for( i=1; i<=n; i++ )
    {
        if( isdigit( s[i] ) )
        {
            int nr = 0;
            while( isdigit( s[i] ) )
                nr = nr * 10 + ( s[i] - '0' ), i++;
            i--;
            values.push( nr );
            continue;
        }
        if( s[i] == '(' )
        {
            ops.push( s[i] );
            continue;
        }
        if( s[i] == ')' )
        {
            while( !ops.empty() && ops.top() != '(' )
            {
                int val1, val2;
                val2 = values.top();
                values.pop();
                val1 = values.top();
                values.pop();
                char op;
                op = ops.top();
                ops.pop();
                values.push( rez( val1, val2, op ) );
            }
            ops.pop();
            continue;
        }
        if( s[i] == '+' || s[i] == '-' || s[i] == '*' || s[i] == '/' )
        {
            while( !ops.empty() && prec[ ops.top() ] >= prec[ s[i] ] )
            {
                int val1, val2;
                val2 = values.top();
                values.pop();
                val1 = values.top();
                values.pop();
                char op;
                op = ops.top();
                ops.pop();
                values.push( rez( val1, val2, op ) );
            }
            ops.push( s[i] );
        }
    }
    while( !ops.empty() )
    {
        int val1, val2;
        val2 = values.top();
        values.pop();
        val1 = values.top();
        values.pop();
        char op;
        op = ops.top();
        ops.pop();
        values.push( rez( val1, val2, op ) );
    }

    fout << values.top();
}

int main()
{
    Citire();
    Rezolvare();
    //cout << sizeof( Lee ) / 1024.0 / 1024.0;
    return 0;
}