Cod sursa(job #2255936)

Utilizator FlaviusFeteanFetean Flavius FlaviusFetean Data 7 octombrie 2018 18:46:23
Problema Evaluarea unei expresii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.49 kb
#include <iostream>
#include <fstream>
#include <cstring>
#include <cstdlib>

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

int nrList[50002];
char opList[50002];
pair<int, int> incParant[25002],k[25002];
int back1, back2, back3, back4;

char opRank[257] = {0};

int efectuareOperatie(int a, int b, char o)
{
    switch(o){
        case '+': a = a + b; break;
        case '-': a = a - b; break;
        case '*': a = a * b; break;
        case '/': a = a / b; break;
    }
    return a;
}

void rezSir_deOperatii(int k1, int k2)
{
    int rez = nrList[k1],
    i = k1 + 1, j = k2;

    while(i <= back1 && j <= back2)
        rez = efectuareOperatie(rez, nrList[i++], opList[j++]);

    back1 = k1 - 1; back2 = k2 - 1;
    nrList[++back1] = rez;
}

void tratareParanteza(char o)
{
    if(o == '('){
        opList[++back2] = '(';
        incParant[++back3] = make_pair(back1 + 1, back2);
    }
    else
    {
        if(back4 > 0 && k[back4].second > incParant[back3].second)
        {
            rezSir_deOperatii(k[back4].first, k[back4].second);
            back4--;
        }
        rezSir_deOperatii(incParant[back3].first, incParant[back3].second + 1);
        back3--;back2--;
    }
}

void tratareOperator(char o)
{
    if(o == '(' || o == ')') tratareParanteza(o);
    else
    {
        if(opRank[o] < opRank[opList[back2]])
        {
            rezSir_deOperatii(k[back4].first, k[back4].second);
            back4--;opList[++back2] = o;
        }
        else
        {
            if((back2 == 0 && opRank[o] == 2) || (opRank[o] == 2 && opRank[opList[back2]] <= 1))
                k[++back4] = make_pair(back1, back2 + 1);
            opList[++back2] = o;
        }
    }
}

int main()
{
    char exprInfix[100002], o;
    int i, f, n, rez, j;
    opRank['+'] = opRank['-'] = 1;
    opRank['*'] = opRank['/'] = 2;

    fin.getline(exprInfix, 100001);

    i = 0; n = strlen(exprInfix);
    while(i < n)
    {
        if(isdigit(exprInfix[i]))
        {
            f = atoi(exprInfix + i);
            nrList[++back1] = f;
            while(isdigit(exprInfix[i]) && i < n) i++;
        }
        else
        {
            o = exprInfix[i];
            tratareOperator(o);
            i++;
        }
    }
    if(back4 > 0)
    {
        rezSir_deOperatii(k[back4].first, k[back4].second);
        back4--;
    }
    rezSir_deOperatii(1, 1);
    fout << nrList[1];
    return 0;
}