Cod sursa(job #2529105)

Utilizator vladcainamisirVlad Cainamisir vladcainamisir Data 22 ianuarie 2020 22:39:45
Problema Evaluarea unei expresii Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.97 kb
#include<cstdio>
#include<cstring>
#include<stack>

std :: stack <char> operatori;
std :: stack <char> numere;
const int LMAX = 100000;
char grad[257];
char expresie[LMAX + 1];
int main()
{
    freopen("evaluare.in" , "r" , stdin);
    freopen("evaluare.out" , "w" , stdout);
    scanf("%s",expresie);
    int len = strlen(expresie);
    grad['+'] = grad['-'] = 1;
    grad['*'] = grad['/'] = 2;
    for(int i = 0 ; i < len ; i ++)
    {
        if(expresie[i] == '(')
        {
            operatori.push('(');
        }
        else if(expresie[i] == '+' || expresie[i] == '-' || expresie[i] == '*' || expresie[i] == '/')
        {
            while(operatori.empty() == false && operatori.top() != '(' && grad[ expresie[i] ] <= grad[operatori.top()])
            {
                int val1 = numere.top();
                numere.pop();
                int val2 = numere.top();
                numere.pop();
                if(operatori.top() == '+')
                    numere.push(val1 + val2);
                if(operatori.top() == '-')
                    numere.push(val1 - val2);
                if(operatori.top() == '*')
                    numere.push(val1 * val2);
                if(operatori.top() == '/')
                    numere.push(val2 / val1);
                operatori.pop();

            }
            operatori.push(expresie[i]);
        }
        else if(expresie[i] >= '0' && expresie[i] <= '9')
        {
            int number = 0;
            while(expresie[i] >='0' && expresie[i] <= '9'){
                number = number * 10 + expresie[i] - '0';
                i ++;
            }
            numere.push(number);
            i --;
        }
        else if(expresie[i] == ')')
        {
            while(operatori.top() != '(')
            {
                int val1 = numere.top();
                numere.pop();
                int val2 = numere.top();
                numere.pop();
                if(operatori.top() == '+')
                    numere.push(val1 + val2);
                if(operatori.top() == '-')
                    numere.push(val1 - val2);
                if(operatori.top() == '*')
                    numere.push(val1 * val2);
                if(operatori.top() == '/')
                    numere.push(val2 / val1);
                operatori.pop();
            }
        }
    }
    while(operatori.size() > 1)
    {
                int val1 = numere.top();
                numere.pop();
                int val2 = numere.top();
                numere.pop();
                if(operatori.top() == '+')
                    numere.push(val1 + val2);
                if(operatori.top() == '-')
                    numere.push(val1 - val2);
                if(operatori.top() == '*')
                    numere.push(val1 * val2);
                if(operatori.top() == '/')
                    numere.push(val2 / val1);
                operatori.pop();
    }
    printf("%d" , numere.top());

}