Cod sursa(job #1836938)

Utilizator leeviiTempfli Levente2 leevii Data 28 decembrie 2016 20:59:52
Problema Evaluarea unei expresii Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.85 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;

int p,i;

stack<int> s;
vector<int> 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=-5;
            if(c=='-') p=-4;
            if(c=='*') p=-7;
            if(c=='/') p=-6;
            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]>=0 && v[i+1]>=0 && v[i+2]<0)
            {
                if(v[i+2]==-4) v[i]=v[i]-v[i+1];
                if(v[i+2]==-5) v[i]=v[i]+v[i+1];
                if(v[i+2]==-6) v[i]=v[i]/v[i+1];
                if(v[i+2]==-7) v[i]=v[i]*v[i+1];
                v.erase(v.begin()+i+1,v.begin()+i+3);
                break;
            }

        }
    }
    fout<<v[0];


    return 0;
}