Cod sursa(job #2019800)

Utilizator Alex_AeleneiAlex Aelenei Ioan Alex_Aelenei Data 8 septembrie 2017 16:27:05
Problema Evaluarea unei expresii Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.67 kb
#include <bits/stdc++.h>

using namespace std;
stack <int> s;
vector <int> v;
char ch[100002];

int main()
{
    freopen("evaluare.in","r",stdin);
    freopen("evaluare.out","w",stdout);
    int i,nr,aux;
    scanf("%s",&ch);
    for(i=0;i<strlen(ch);++i)
    {
        if(isdigit(ch[i]))
        {
            nr=atoi(ch+i);
            while(isdigit(ch[i]))
                ++i;
            --i;
            v.push_back(nr);
            continue;
        }
        if(ch[i]=='(')
            s.push(ch[i]);
        if(ch[i]=='+'||ch[i]=='-'||ch[i]==')')
        {
            while(!(s.empty())&& s.top()!='(')
            {
                if(s.top()=='+')
                    v.push_back(-1);
                if(s.top()=='-')
                    v.push_back(-2);
                if(s.top()=='*')
                    v.push_back(-3);
                if(s.top()=='/')
                    v.push_back(-4);
                s.pop();
            }
            if(ch[i]==')')
            {
                s.pop();
                continue;
            }
            s.push(ch[i]);
        }
        if(ch[i]=='*'||ch[i]=='/')
        {
            while(!(s.empty())&& s.top()!='(' &&s.top()!='+'&&s.top()!='-')
            {
                if(s.top()=='*')
                    v.push_back(-3);
                if(s.top()=='/')
                    v.push_back(-4);
                s.pop();
            }
            s.push(ch[i]);
        }
    }
    while(!s.empty())
    {
        if(s.top()=='+')
            v.push_back(-1);
        if(s.top()=='-')
            v.push_back(-2);
        if(s.top()=='*')
            v.push_back(-3);
        if(s.top()=='/')
            v.push_back(-4);
        s.pop();
    }
    for(i=0;i<v.size();++i)
    {
        if(v[i]>=0)
            s.push(v[i]);
        else
        {
            if(v[i]==-1)
            {
                nr=s.top();
                s.pop();
                nr+=s.top();
                s.pop();
                s.push(nr);
            }
            if(v[i]==-2)
            {
                nr=s.top();
                s.pop();
                nr-=s.top();
                s.pop();
                s.push(nr);
            }
            if(v[i]==-3)
            {
                nr=s.top();
                s.pop();
                nr*=s.top();
                s.pop();
                s.push(nr);
            }
            if(v[i]==-4)
            {
                nr=s.top();
                s.pop();
                aux=s.top();
                s.pop();
                s.push(aux/nr);
            }
        }
    }
    printf("%d",s.top());
}