Cod sursa(job #1977801)

Utilizator KOzarmOvidiu Badea KOzarm Data 6 mai 2017 10:38:39
Problema Evaluarea unei expresii Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 2.43 kb
#include <fstream>
#include <deque>
#include <string.h>
using namespace std;
ifstream fin("evaluare.in");
ofstream fout("evaluare.out");

char x[100003];
int i=0,n;

deque <char> st,pend;
deque <int> tm,pendn;



int get_termen()
{
    int nr=0;
    while(x[i]>='0'&&x[i]<='9')
    {
        nr=nr*10+x[i]-'0';
        i++;
    }
    return nr;
}

void efect()
{
    int x1=pendn.back(),x2;
    if(!pend.empty())
    {
        char s=pend.back();
        pend.pop_back();
        pendn.pop_back();
        while(!pend.empty()&&(((s=='+'||s=='-')&&(pend.back()!='*'&&pend.back()!='/'))||s=='*'||s=='/'))
        {
            x2=pendn.back();
            pendn.pop_back();
            if(s=='+')
                x1+=x2;
            else
            if(s=='-')
                x1-=x2;
            else
            if(s=='*')
                x1*=x2;
            else
            if(s=='/')
                x1/=x2;
            s=pend.back();
            pend.pop_back();
        }
        if(!pend.empty())
            efect();
        x2=pendn.back();
        pendn.pop_back();
        if(s=='+')
            x1+=x2;
        else
        if(s=='-')
            x1-=x2;
        else
        if(s=='*')
            x1*=x2;
        else
        if(s=='/')
            x1/=x2;
        pendn.push_back(x1);
    }
}

void get_expresie()
{
    while(i<n)
    {
        if(x[i]>='0'&&x[i]<='9')
            tm.push_back(get_termen());
        else
        if(x[i]==')')
        {
            i++;
            pendn.push_back(tm.back());
            tm.pop_back();
            while(st.back()!='(')
            {
                pend.push_back(st.back());
                pendn.push_back(tm.back());
                st.pop_back();
                tm.pop_back();
            }
            st.pop_back();
            efect();
            tm.push_back(pendn.front());
            pendn.pop_front();
        }
        else
        {
            st.push_back(x[i]);
            i++;
        }
    }
    pendn.push_back(tm.back());
    tm.pop_back();
    while(!st.empty())
            {
                pend.push_back(st.back());
                pendn.push_back(tm.back());
                st.pop_back();
                tm.pop_back();
            }
    efect();
}



int main()
{
    fin.getline(x,100003);
    n=strlen(x);
    get_expresie();
    fout<<pendn.front();
    return 0;
}