Cod sursa(job #1363441)

Utilizator sergiunascaSergiu Nasca sergiunasca Data 26 februarie 2015 23:05:40
Problema Evaluarea unei expresii Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 2.52 kb
#include <stdio.h>
#include <vector>
#include <string.h>
using namespace std;
std::vector<int> a,b;
int nr;
char x[100002],y;

void doit(int start,int stop,int signal)
{
    for(int i=start;i<=stop;++i)
    {
        if(b[i]==signal)
        {
            if(signal == 1)a[i-1] *= a[i+1];
            else if(signal == 2)a[i-1] /= a[i+1];
            else if(signal == 3)a[i-1] += a[i+1];
            else if(signal == 4)a[i-1] -= a[i+1];
            stop -= 2;
            a.erase(a.begin()+i,a.begin()+i+2);
            b.erase(b.begin()+i,b.begin()+i+2);
        }
    }
}

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