Cod sursa(job #2788152)

Utilizator AlexNicuNicu Alexandru AlexNicu Data 25 octombrie 2021 10:18:48
Problema Evaluarea unei expresii Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.54 kb
#include <fstream>
#include <assert.h>

using namespace std;

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

#define NMAX 100000

string s;
int poz_s;

int stiva_numere[NMAX];
int top_stiva_numere;

char stiva_operatori[NMAX];
int top_stiva_operatori;

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

void push_Operator() {
    if ( s[poz_s] == '+' || s[poz_s] == '-' || s[poz_s] == '*' || s[poz_s] == '/' ) {
        stiva_operatori[top_stiva_operatori++] = s[poz_s];
    }
}

void push_Number(int a) {
    stiva_numere[top_stiva_numere++] = a;
}

void pop_Operator() {
    if ( top_stiva_operatori > 0 )
        top_stiva_operatori--;
}

void pop_Number() {
    if ( top_stiva_numere > 0 )
        top_stiva_numere--;
}

char top_Operator() {
    if ( top_stiva_operatori > 0 )
        return stiva_operatori[top_stiva_operatori - 1];
    return 0;
}

int top_Number() {
    if ( top_stiva_numere > 0 )
        return stiva_numere[top_stiva_numere - 1];
    return 0;
}

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

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

int Last_Compute() {
    int a, b;
    char op;
    b = top_Number();
    pop_Number();
    a = top_Number();
    pop_Number();
    op = top_Operator();
    pop_Operator();
    push_Number(compute( a, b, op ));
}

int main() {
    cin >> s;
    poz_s = 0;
    while ( poz_s < s.size() ) {
        if ( isdigit(s[poz_s]) ) {
            push_Number(factor());
        }
        else if ( s[poz_s] == '(' ) {
          poz_s++;
          push_Operator();
        }
        else if ( s[poz_s] == ')' ) {
            while ( top_Operator() != 0 && top_Operator() != '(' ) {
               Last_Compute();
            }
            poz_s++;
        }
        else if ( priority(s[poz_s]) ) {
            while ( priority(top_Operator()) >= priority(s[poz_s]) ) {
                Last_Compute();
            }
            push_Operator();
            poz_s++;
        }
    }
    while ( top_stiva_operatori > 0 ) {
        Last_Compute();
    }
    cout << top_Number();
    return 0;
}