Cod sursa(job #1975607)

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

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

vector<char>G;
deque<char>s;
deque<int>e;
string expr;

void Postfix(const string &expr)
{
    for (int i = 0; expr[i]; ++i)
        if (isdigit(expr[i]))
            G.push_back(expr[i]);
        else
        {
            G.push_back(' ');
            if (expr[i] == '(' || expr[i] == '*' || expr[i] == '/')
                s.push_back(expr[i]);
            else
                if (expr[i] == ')')
                {
                    char ch = s.back();
                    while (ch != '(' && s.size())
                    {
                        G.push_back(ch);
                        s.pop_back();
                        ch = s.back();
                    }
                    if (s.size())
                        s.pop_back();
                }
                else
                    if (expr[i] == '-' || expr[i] == '+')
                    {
                         char ch = s.back();
                        while (ch == '*' || ch == '/' && s.size())
                            {
                                G.push_back(ch);
                                s.pop_back();
                                ch = s.back();
                            }
                        s.push_back(expr[i]);
                    }
        }
    G.push_back(' ');
    for (; s.size(); 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;
}