Cod sursa(job #1836945)

Utilizator leeviiTempfli Levente2 leevii Data 28 decembrie 2016 21:06:46
Problema Evaluarea unei expresii Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.95 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <stack>

using namespace std;

//#define fout cout

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

char c,ce;

long long p,i;

stack<long long> s;
vector<long long> v;

int main()
{



    ce='z';
    while(fin>>c)
    {
        if(c-'0'>=0 && c-'0'<10)
        {
            if(ce-'0'>=0 && ce-'0'<10)
            {
                v[v.size()-1]*=10;
                v[v.size()-1]+=c-'0';
            }
            else v.push_back(c-'0');

        }
        else
        if(c!=')' && c!='(')
        {
            if(c=='+') p=-50000000;
            if(c=='-') p=-40000000;
            if(c=='*') p=-70000000;
            if(c=='/') p=-60000000;
            while(!s.empty() && s.top()/2<=p/2 && s.top()!=-1)
            {
                if(s.top()!=-1) v.push_back(s.top());
                s.pop();
                if(s.empty()) break;
            }
            s.push(p);

        }
        else
        if(c=='(')
        {
            s.push(-1);
        }
        else
        {
            p=s.top();
            while(p!=-1)
            {
                v.push_back(s.top());
                s.pop();
                p=s.top();
            }
            s.pop();
        }
        ce=c;

    }
    while(!s.empty())
    {
        v.push_back(s.top());
        s.pop();
    }

    while(v.size()!=1)
    {
        for(i=0;i<=v.size()-3;i++)
        {
            if(v[i]>=-10000000 && v[i+1]>=-10000000 && v[i+2]<-10000000)
            {
                if(v[i+2]==-40000000) v[i]=v[i]-v[i+1];
                if(v[i+2]==-50000000) v[i]=v[i]+v[i+1];
                if(v[i+2]==-60000000) v[i]=v[i]/v[i+1];
                if(v[i+2]==-70000000) v[i]=v[i]*v[i+1];
                v.erase(v.begin()+i+1,v.begin()+i+3);
                break;
            }

        }
    }
    fout<<v[0];


    return 0;
}