Cod sursa(job #1363633)

Utilizator sergiunascaSergiu Nasca sergiunasca Data 27 februarie 2015 09:12:17
Problema Evaluarea unei expresii Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 2.18 kb
#include <stdio.h>
#include <vector>
#include <string.h>
#include <utility>
using namespace std;
std::vector< std::pair<int,char> > a;
int nr;
char y;
char semne[5];
void doit(int start,int stop,char sign)
{
    for(int i=start;i<=stop&&i<a.size();++i)
    {
        while(a[i].second==sign&&i<a.size())
        {
            if(sign=='*')a[i-1].first *= a[i+1].first;
            else if(sign=='/')a[i-1].first /= a[i+1].first;
            else if(sign=='+')a[i-1].first += a[i+1].first;
            else if(sign=='-')a[i-1].first -= a[i+1].first;
            stop -= 2;
            a.erase(a.begin()+i,a.begin()+i+2);
        }
    }
}

int main()
{
    freopen("evaluare.in","r",stdin);
    freopen("evaluare.out","w",stdout);
    strcpy(semne,"*/+-");
    while(scanf("%c",&y))
    {
        if(y>='0'&&y<='9')
        {
            nr = nr * 10 + y - '0';
        }
        else
        {
            if(nr!=0)a.push_back( std::make_pair(nr,'0') );
            if(y=='(')a.push_back( std::make_pair(0,'(') );
            else if(y==')')a.push_back( std::make_pair(0,')') );
            else if(y=='*')a.push_back( std::make_pair(0,'*') );
            else if(y=='/')a.push_back( std::make_pair(0,'/') );
            else if(y=='+')a.push_back( std::make_pair(0,'+') );
            else if(y=='-')a.push_back( std::make_pair(0,'-') );
            nr = 0;
            if(y=='\n')break;
        }
    }
    bool este = false;
    do
    {
        este = false;
        for(int i=0;i<a.size();++i)
        {
            if(a[i].second==')')
            {
                este = true;
                int k = i;
                do
                {
                    k--;
                    if(a[k].second=='(')break;
                }while(!(a[k].second=='('));
                for(int j=0;j<=3;++j)
                {
                    doit(k,i,semne[j]);
                }
                a[k] = a[k+1];
                a.erase(a.begin()+k+1,a.begin()+k+3);
            }
        }
    }while(!(este==false));
    nr = a.size()-2;
    for(int j=0;j<=3;++j)
    {
        doit(0,nr,semne[j]);
    }
    printf("%d",a[0].first);
    return 0;
}