Cod sursa(job #1214362)

Utilizator rogoz.bogdanRogoz Bogdan rogoz.bogdan Data 30 iulie 2014 10:21:33
Problema Evaluarea unei expresii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.69 kb
#include <fstream>
#include <cstring>
#include <vector>
#define MX 100005
using namespace std;

ifstream fin("evaluare.in");
ofstream fout("evaluare.out");
char s[MX];
int l;

struct elem
{
    bool tip;   //0=operand, 1=operator
    int info;
};
vector<char> inf;
vector<elem> pof;
vector<int> rez;

int prio(char i)
{
    if(i=='+' || i=='-') return 1;
    else
    if(i=='*' || i=='/') return 2;
    else
    return 0;
}

int numar(int &i)
{
    int nr=0;
    while(s[i]>='0' && s[i]<='9')
    {
        nr = nr*10 + s[i] - '0';
        i++;
    }
    i--;
    return nr;
}

void inf_to_pof()
{
    int i;
    elem e;
    for(i=0; i<l; i++)
    {
        if( strchr("+-*/", s[i]) )
        {
            if(!inf.empty())
            {
                while( prio(inf.back()) >= prio(s[i]) )
                {
                    e.tip = 0;
                    e.info = inf.back();
                    pof.push_back(e);
                    inf.pop_back();
                }
            }
            inf.push_back(s[i]);
        }
        else
        if( s[i]=='(' )
        {
            inf.push_back(s[i]);
        }
        else
        if( s[i]==')' )
        {
            while( inf.back() != '(' )
            {
                e.tip = 0;
                e.info = inf.back();
                pof.push_back(e);
                inf.pop_back();
            }
            inf.pop_back();
            //fout<<inf.size()<<' '; fout.flush();
        }
        else
        {
            e.tip = 1;
            e.info = numar(i);
            pof.push_back(e);
        }

        //fout<<inf.size()<<' '; fout.flush();
    }

    while(!inf.empty())
    {
        e.tip = 0;
        e.info = inf.back();
        pof.push_back(e);
        inf.pop_back();
    }
}

void pof_to_rez()
{
    vector<elem>::iterator it;
    int o1,o2;
    char x;
    for(it=pof.begin(); it!=pof.end(); it++)
    {
        if( it->tip )
        {
            rez.push_back(it->info);
        }
        else
        {
            o2 = rez.back(); rez.pop_back();
            o1 = rez.back(); rez.pop_back();
            x = (char)(it->info);
            switch(x)
            {
                case '+': rez.push_back(o1+o2); break;
                case '-': rez.push_back(o1-o2); break;
                case '*': rez.push_back(o1*o2); break;
                case '/': rez.push_back(o1/o2); break;
            }
        }
    }
}

int main()
{
    fin>>s;
    l = strlen(s);
    inf_to_pof();
    pof_to_rez();

    //fout<<pof.size();
    fout<<rez[0];
    rez.clear();
    pof.clear();

    fin.close(); fout.close();
    return 0;
}