Cod sursa(job #2788507)

Utilizator andreipirjol5Andrei Pirjol andreipirjol5 Data 25 octombrie 2021 19:38:38
Problema Evaluarea unei expresii Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.58 kb
#define N 100000
#include <stdio.h>
#include <cstring>
using namespace std;

char s[N + 5] ;
int i ;

char operators[N + 5] ;
int operatorsize ;

int factors[N + 5] ;
int factorsize ;

//operatori
short prioritate (char operatorr)
{
    if(operatorr == '*' or operatorr == '/')
        return 1 ;
    if(operatorr == '+' or operatorr == '-')
        return 2 ;

    return 0 ;
}

void adaugare (char character)
{
    if(character == '*' or character == '/' or character == '+' or character == '-')
        operators[operatorsize++] = character ;
}
char stergere ()
{
    if(operatorsize > 0)
        return operators[--operatorsize] ;

    return '\0' ;
}
char first ()
{
    if(operatorsize > 0)
        return operators[--operatorsize] ;

    return '\0' ;
}
bool ifempty()
{
    if(operatorsize > 0)
        return true ;

    return false ;
}

//factori
int factor()
{
    int rez = 0 ;

    while (s[i] >= '0' and s[i] <= '9')
    {
        rez = rez * 10 + (s[i] - '0') ;
        i++;
    }

    return rez ;
}
void adaugare2 (int factor)
{
    factors[factorsize++] = factor ;
}
int stergere2 ()
{
    if(factorsize > 0)
    return factors[--factorsize] ;

    return '\0' ;
}

//calcul efectiv
int relatie(int a, int b, char operatorr)
{
    int c = 0 ;
    if (operatorr == '*')
        c = a * b ;
    else if (operatorr == '/')
        c = a / b;
    else if (operatorr == '+')
        c = a + b;
    else if (operatorr == '-')
        c = a - b;

    return c ;
}
void stergere_relatie()
{
    int a, b ;

    a = stergere2() ;
    b = stergere2() ;
    adaugare(relatie(a, b, stergere())) ;
}
int main()
{
    FILE *fin, *fout ;
    fin = fopen("evaluare.in", "r") ;
    fout = fopen("evaluare.out", "w") ;

    fgets(s, N + 5, fin) ;
    int length = strlen(s) ;

    i = 0 ;
    while(i < length)
    {
        if(s[i] >= '0' and s[i] <= '9')
            adaugare2(factor()) ;
        else if(s[i] == '(')
            adaugare(s[i++]) ;
        else if(s[i] == ')')
        {
            while(first() != '(')
                stergere_relatie() ;
            stergere() ;
            i++;
        }
        else if(prioritate(s[i]) > 0)
        {
            while(prioritate(first()) > 0 and prioritate(first()) >= prioritate(s[i]))
                stergere_relatie() ;
            adaugare(s[i++]) ;
        }
        else i++;
    }

    while(ifempty())
        stergere_relatie() ;

    fprintf(fout, "%d", stergere2()) ;

    fclose(fin) ;
    fclose(fout) ;
    return 0;
}