Cod sursa(job #1975751)

Utilizator sfechisalin@yahoo.comSfechis Alin [email protected] Data 1 mai 2017 20:58:00
Problema Evaluarea unei expresii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.12 kb
#include <bits/stdc++.h>

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

vector<int>number;
deque<char>s;

int isOperator(char a){
    return a == '+' || a == '/' || a == '*' || a == '-';
}

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

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

void emptyStack()
{
    while (s.size())
    {
        if (s.back() == '(')
                return;
        int n1 = number.back(); number.pop_back();
        int n2 = number.back(); number.pop_back();
        number.push_back(doMath(n2,n1,s.back()));
        s.pop_back();
    }
}

void solve(const string &expr)
{
    for (int i = 0; expr[i]; ++i)
        if (isdigit(expr[i]))
        {
            int n1 = 0;
            for (; isdigit(expr[i]);n1 = n1 * 10 + (expr[i]-'0'),++i);
            --i;
            number.push_back(n1);
            continue;
        }
        else
            if(expr[i] == '(')
               s.push_back(expr[i]);
            else
                if (expr[i] == ')')
                {
                    emptyStack();
                    s.pop_back();
                }
                else
                    if ( isOperator(expr[i]) )
                    {
                        while (s.size() && getPriority(s.back()) >= getPriority(expr[i]))
                        {
                            int n1 = number.back(); number.pop_back();
                            int n2 = number.back(); number.pop_back();
                            number.push_back(doMath(n2,n1,s.back()));
                            s.pop_back();
                        }

                        s.push_back(expr[i]);
                    }
    emptyStack();
}

int main()
{
    string expr;
    fin >> expr;
    solve(expr);
    fout << number[0];
    return 0;
}