Cod sursa(job #1975664)

Utilizator sfechisalin@yahoo.comSfechis Alin [email protected] Data 1 mai 2017 16:57:08
Problema Evaluarea unei expresii Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 2.16 kb
#include <bits/stdc++.h>

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


inline int getPrioritate(char ch)
{
    if (ch == '(') return -1;
    if (ch == '+' || ch == '-') return 0;
    if (ch == '*' || ch == '/') return 1;
}

vector<char>G;
deque<char>s;
deque<int>e;
string expr;
void Postfix(const string& expr)
{
    for (int i = 0; i < expr.length(); ++i)
            if (isdigit(expr[i]))
                G.push_back(expr[i]);
            else
            {
                G.push_back(' ');
                if (expr[i] == '(')
                    s.push_back(expr[i]);
                else
                    if (expr[i] == ')')
                    {
                     for(; s.back() != '('; G.push_back(s.back()),s.pop_back());
                     s.pop_back();
                    }
                    else
                        {
                            while(s.size() && getPrioritate(s.back()) > getPrioritate(expr[i]))
                                G.push_back(s.back()),s.pop_back();
                            s.push_back(expr[i]);
                          //  cout << "S : " << expr[i] << "\n";
                        }
            }
    G.push_back(' ');
    for (; !s.empty(); G.push_back(s.back()), s.pop_back());
}

inline 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;
        default: return 0;
    }
}

int calculate()
{
    int number = 0;
    for (int i = 0 ; i < G.size(); ++i)
     if (isdigit(G[i]))
            number = number * 10 + (G[i] - '0');
        else
             if (G[i] == ' ')
            {
                if (number)
                    e.push_back(number),number = 0;
            }
            else
            {
                int el1 = e.back(); e.pop_back();
                int el2 = e.back(); e.pop_back();
                e.push_back(doMath(el2,el1,G[i]));
            }
    return e.back();
}

int main()
{
    fin >> expr;
    Postfix(expr);
    fout << calculate();
    return 0;
}