Cod sursa(job #2659490)

Utilizator Radu_FilipescuFilipescu Radu Radu_Filipescu Data 16 octombrie 2020 20:56:23
Problema Evaluarea unei expresii Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.16 kb
#include <bits/stdc++.h>

using namespace std;

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

string s;

deque <int> var;
deque <char> op;

void Read() {
    fin >> s;
    fin.close();
}

bool is_operator( char c ) {
    return strchr( "+-*/", c );
}

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

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

void Do() {
    for( int i = 0; i < s.size(); ++i ) {
        if( s[i] == '(' ) { op.push_back( '(' ); continue; }
        if( isdigit( s[i] ) ) {
            int aux = 0;

            while( i < s.size() && isdigit( s[i] ) ) {
                aux = aux * 10 + s[i] - '0';
                ++i;
            }
            --i;

            var.push_back( aux );
            continue;
        }
        if( is_operator( s[i] ) ) {
            while( !op.empty() && Priority( op.back() ) >= Priority( s[i] ) ) {
                int a, b;
                char Op = op.back();

                op.pop_back();
                b = var.back(); var.pop_back();
                a = var.back(); var.pop_back();

                var.push_back( Operate( a, b, Op ) );
            }
            op.push_back( s[i] );
            continue;
        }
        if( s[i] == ')' ) {
          while( op.back() != '(' ) {
             int a, b;
             char Op = op.back();

             op.pop_back();
             b = var.back(); var.pop_back();
             a = var.back(); var.pop_back();

             var.push_back( Operate( a, b, Op ) );
          }
          op.pop_back();
        }

    }

    while( !op.empty() ) {
       int a, b;
       char Op = op.back();

       op.pop_back();
       b = var.back(); var.pop_back();
       a = var.back(); var.pop_back();

       var.push_back( Operate( a, b, Op ) );
    }

    fout << var.back() << '\n';
    fout.close();
}

int main()
{
    Read();
    Do();

    return 0;
}