Cod sursa(job #1520899)

Utilizator zacuscaAlex Iordache zacusca Data 9 noiembrie 2015 17:48:04
Problema Evaluarea unei expresii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.07 kb
#include <fstream>
#include <vector>
#include <stack>
#include <string>

using namespace std;

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

string Data;
stack <int> Operators;
char Priority[101];
vector <int> Numbers;

int BuildNumber (int &pos, int nr = 0)
{
    for (;pos < Data.size() and isdigit(Data[pos]); ++pos)
    {
        nr = nr * 10 + (Data[pos] - '0');
    }
    return nr;
}

void Calculate (char op)
{
    int y = Numbers.back(); Numbers.pop_back();
    int x = Numbers.back(); Numbers.pop_back();
    if (op == '+') Numbers.push_back(x + y);
    else if (op == '-') Numbers.push_back(x - y);
    else if (op == '*') Numbers.push_back(x * y);
    else Numbers.push_back(x / y);
}

void Evaluate()
{
    for (int pos = 0; pos < Data.size(); ++pos)
    {
        if (isdigit(Data[pos]))
        {
            Numbers.push_back(BuildNumber(pos));
            pos--;
        }
        else
        {
            if (Data[pos] == '(') Operators.push(Data[pos]);
            else
            {
                if (Data[pos] == ')')
                {
                    while (Operators.top() != '(')
                    {
                        Calculate(Operators.top());
                        Operators.pop();
                    }
                    Operators.pop();
                }
                else
                {
                    while (!Operators.empty() and Priority[Operators.top()] >= Priority[Data[pos]])
                    {
                        Calculate(Operators.top());
                        Operators.pop();
                    }
                    Operators.push(Data[pos]);
                }
            }
        }
    }

    while (!Operators.empty())
    {
        Calculate(Operators.top());
        Operators.pop();
    }
}

int main()
{
    Priority['*'] = Priority['/'] = 2;
    Priority['-'] = Priority['+'] = 1;
    Priority['('] = Priority[')'] = 0;

    in >> Data;
    Evaluate();

    out << Numbers.back() << '\n';

    out.close();
    return 0;
}