Cod sursa(job #735636)

Utilizator BitOneSAlexandru BitOne Data 16 aprilie 2012 21:50:51
Problema Evaluarea unei expresii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.3 kb
#include <stack>
#include <string>
#include <fstream>
#include <cstdlib>

using namespace std;

stack<int> dSt;
stack<char> cSt;
string exp, transf;
string::const_iterator it, iend;

inline int priority(char c)
{
    switch(c)
    {
        case '(' : return 0;
        case '+' : ;
        case '-' : return 1;
        case '*' : ;
        case '/' : return 2;
        case ')' : return 3;
        default  : return 5;
    }
}
int main()
{
    int pIt, x, a, b;
    ifstream in("evaluare.in");
    ofstream out("evaluare.out");

    getline(in, exp);
    for( it=exp.begin(), iend=exp.end(); it < iend; )
    {
        if(*it >= '0' && *it <= '9')
        {
            for( ; it < iend && *it >= '0' && *it <= '9'; ++it)
                transf.push_back(*it);
            transf.push_back(',');
        }
        else if('(' == *it)
             {
                 cSt.push(*it);
                 ++it;
             }
             else if(')' == *it)
                   {
                       for(++it; '(' != cSt.top(); transf.push_back(cSt.top()), cSt.pop());
                       cSt.pop();
                   }
                   else {
                            for(pIt=priority(*it); !cSt.empty() && pIt <= priority(cSt.top()); transf.push_back(cSt.top()), cSt.pop());
                            cSt.push(*it);  ++it;
                        }
    }
    for(; !cSt.empty(); transf.push_back(cSt.top()), cSt.pop());
    for(it=transf.begin(), iend=transf.end(); it < iend; ++it)
    {
        if(*it >= '0' && *it <= '9')
        {
            for(x=0; it < iend && *it >= '0' && *it <= '9'; ++it)
                x=x*10+*it-'0';
            dSt.push(x);
        }
        else {
                x=priority(*it);
                if(x >= 1 && x < 3)
                {
                    b=dSt.top(); dSt.pop();
                    a=dSt.top(); dSt.pop();
                    switch(*it)
                    {
                        case '+' : dSt.push(a+b); break;
                        case '-' : dSt.push(a-b); break;
                        case '*' : dSt.push(a*b); break;
                        case '/' : dSt.push(a/b); break;
                    }
                 }
             }
    }
    out<<dSt.top()<<'\n';

    return EXIT_SUCCESS;
}