Cod sursa(job #2883703)

Utilizator gargantuanRares Oprea gargantuan Data 1 aprilie 2022 18:32:01
Problema Evaluarea unei expresii Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.98 kb
#include <fstream>
#include <stack>
#include <string.h>
using namespace std;

ifstream cin("evaluare.in");
ofstream cout("evaluare.out");

stack <int>f; /// factors
stack <char>o; /// operators
char s[100001];
int i;

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

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

int compute( int a,int b, char op)
{
    if( op == '+' )
        return a + b;
    if( op == '-' )
        return b - a;
    if( op == '*' )
        return a * b;
    if( op == '/' && a )
        return b / a;
    return 0;
}

void computelast()
{
    int f1=0, f2=0;
    char op;
    if( f.size() )
    {
        f1 =  f .top();
        f.pop();
    }
    if ( f.size() )
    {
        f2 =  f .top();
        f.pop();
    }
    if( o.size() )
    {
        op = o.top();
        o.pop();
    }
    f.push(compute(f1, f2, op) );
}

int main()
{
    int n;
    cin.getline(s,100001);
    n = strlen(s);
    while( i < n )
    {
        if( s[i] >= '0' && s[i] <= '9' )
        {
            f.push(factor());
        }
        else
            if(s[i]=='(')
        {
            o.push(s[i]);
            i++;
        }
        else
            if(s[i]==')')
            {
                while( o.size() && o.top() != '(' )
                    computelast();
            i++;
            o.pop();
            }
        else if( priority(s[i]))
        {
            while( o.size() && f.size() && priority(o.top()) >= priority(s[i]))
                computelast();
            if( priority(s[i]) )
                o.push(s[i]);
            i++;
        }
        else
            i++;
    }
    while ( o.size() && f.size() )
    {
        computelast();
    }
    cout << f.top();
    return 0;
}