Cod sursa(job #1155016)

Utilizator rockerboyHutter Vince rockerboy Data 26 martie 2014 16:16:28
Problema Evaluarea unei expresii Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 3.1 kb
#include <fstream>
#include <stack>
#include <string>
#include <sstream>
#include <vector>

#define PLUSZ   1000000001
#define MINUSZ  1000000002
#define SZOR    1000000003
#define OSZT    1000000004

using namespace std;
ifstream f("evaluare.in");
ofstream g("evaluare.out");

inline bool szam (const char temp)
{
    if (temp > 47 && temp < 58) return 1;
    return 0;
}

string s;
vector<int> kifejezes;
stack<char> verem;
stack<int>  eredm;
istringstream be;

char temp;
inline int beolvas_szam ()
{
    int ret=0;
    while (szam(s[0]))
    {
        ret *= 10;
        ret += s[0]-'0';
        s.erase(0,1);
    }
    if (ret) return ret;
}

void kiir_kifejezes (const vector<int>& t)
{
    for (vector<int>::const_iterator i = t.begin(); i<t.end(); i++)
    {
        if (*i < 1000000001) g << " " << *i;
        else
        {
            if (*i == SZOR) g << '*';
            else if (*i == OSZT) g << '/';
            else if (*i == PLUSZ) g << '+';
            else if (*i == MINUSZ) g << '-';
        }
    }
}

int main()
{
    f >> s;
    s = '(' + s + ')';

    while (s.length())
    {
        if (szam(s[0])) kifejezes.push_back(beolvas_szam ());
        else if (s[0] == '(')
        {
            verem.push(s[0]);
            s.erase(0,1);
        }
        else if (s[0] == ')' || s[0] == '+' || s[0] == '-')
        {
            temp = verem.top();
            while (temp != '(')
            {
                if (temp == '+') kifejezes.push_back(PLUSZ);
                else if (temp == '-') kifejezes.push_back(MINUSZ);
                else if (temp == '*') kifejezes.push_back(SZOR);
                else kifejezes.push_back(OSZT);
                verem.pop();
                temp = verem.top();
            }
            if (s[0] == ')')
                verem.pop();
            else
                verem.push(s[0]);
            s.erase(0,1);
        }
        else
        {
            temp = verem.top();
            while (temp != '+' && temp != '-' && temp != '(')
            {
                if (temp == '+') kifejezes.push_back(PLUSZ);
                else if (temp == '-') kifejezes.push_back(MINUSZ);
                else if (temp == '*') kifejezes.push_back(SZOR);
                else kifejezes.push_back(OSZT);
                verem.pop();
                temp = verem.top();
            }
            verem.push(s[0]);
            s.erase(0,1);
        }
    }
    //kiir_kifejezes(kifejezes);
    //g << "\n\n";

    int t, t2, muv;
    for (vector<int>::iterator i = kifejezes.begin(); i<kifejezes.end(); i++)
    {
        t = *i;
        if (t < 1000000001)
        {
            eredm.push(t);
        }
        else
        {
            muv = t;
            t = eredm.top();
            eredm.pop();
            t2 = eredm.top();
            eredm.pop();
            if (muv == PLUSZ) eredm.push(t + t2);
            else if (muv == MINUSZ) eredm.push(t2 - t);
            else if (muv == OSZT) eredm.push(t2 / t);
            else eredm.push(t * t2);
        }
    }
    g << eredm.top();
}