Cod sursa(job #2012154)

Utilizator sfechisalin@yahoo.comSfechis Alin [email protected] Data 18 august 2017 00:30:23
Problema Evaluarea unei expresii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.77 kb
#include <bits/stdc++.h>

#define DIM  100005
using namespace std;

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

char str[DIM];
vector<int>numbers;
vector<char>operators;

int getPriority(char ch)
{
    switch (ch)
    {
        case '(' : return 0; break;
        case ')' : return 1; break;
        case '+' : return 2; break;
        case '-' : return 2; break;
        case '*' : return 3; break;
        case '/' : return 3; break;
        default:
            return -1;
    }
}

int doMath(int a, char op, int b)
{
    switch (op)
    {
        case '+' : return a + b;
        case '-' : return a - b;
        case '*' : return a * b;
        case '/' : return a / b;
        default:
            return 0;
    }
}

int doStuff(const char sir[])
{
    int aux1, aux2;
    for (int i = 0; sir[i] ; ++i)
        if (getPriority(sir[i]) == -1) // number
        {
            int aux = 0;
            for (; getPriority(sir[i]) == -1 && sir[i]; aux = aux * 10 + (sir[i] - '0'), ++i);
            --i;
            numbers.push_back(aux);
        }
        else
            if (getPriority(sir[i]) == 0 )
                operators.push_back(sir[i]);
            else
                if (getPriority(sir[i]) == 1)
                {
                    for (; operators.back() != '('; aux2 = numbers.back(), numbers.pop_back(),
                                                    aux1 = numbers.back(), numbers.pop_back(),
                                                    numbers.push_back(doMath(aux1, operators.back(), aux2)),
                                                    operators.pop_back());
                    operators.pop_back();
                }
                else // +-/* case
                {
                    while( operators.size() && numbers.size() >= 2 && getPriority(operators.back()) >= getPriority(sir[i]) )
                    {
                        aux2 = numbers.back(), numbers.pop_back(),
                                                    aux1 = numbers.back(), numbers.pop_back(),
                                                    numbers.push_back(doMath(aux1, operators.back(), aux2));
                        operators.pop_back();
                    }
                    operators.push_back(sir[i]);
                }

     for (; operators.size() ; aux2 = numbers.back(), numbers.pop_back(),
                                                    aux1 = numbers.back(), numbers.pop_back(),
                                                    numbers.push_back(doMath(aux1, operators.back(), aux2)),
                                                    operators.pop_back());
    return numbers[0];
}

int main()
{
    fin >> str;

    fout << doStuff(str);
    return 0;
}