Cod sursa(job #1975724)

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

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


bool lessOp(char op, char op2){
    int st, dr;
    if(op == '+' || op == '-')
        st = 1;
    if(op == '*' || op == '/')
        st = 2;
    if(op2 == '+' || op2 == '-')
        dr = 1;
    if(op2 == '*' || op2 == '/')
        dr = 2;
    return(st <= dr);
}

bool operator0(char ch){
    if(ch == '+' || ch == '/' || ch == '*' || ch == '-')
        return(1);
    return(0);
}

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 (operator0(expr[i]))
                {
                    while(s.size() && lessOp(expr[i],s.back()) && s.back() != '(')
                         G.push_back(s.back()),s.pop_back();
                     s.push_back(expr[i]);

                }
                else
                    if (expr[i] == '(')
                        s.push_back(expr[i]);
                    else
                        if (expr[i] == ')')
                        {
                            while (s.size() && s.back() != '(')
                                    G.push_back(s.back()), s.pop_back();
                            s.pop_back();
                        }
            }

    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()
{
    getline(fin,expr);
    Postfix(expr);
    fout << calculate();
    return 0;
}