Cod sursa(job #1977812)

Utilizator KOzarmOvidiu Badea KOzarm Data 6 mai 2017 11:08:28
Problema Evaluarea unei expresii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.91 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,x3;
    if(!pend.empty())
    {
        char s=pend.back(),s1;
        pend.pop_back();
        pendn.pop_back();
        while(!pend.empty())
        {
            if((((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();
            }
            else
            {
                x2=pendn.back();
                pendn.pop_back();
                x3=pendn.back();
                pendn.pop_back();
                s1=pend.back();
                pend.pop_back();
                if(s1=='*')
                    x2*=x3;
                else
                if(s1=='/')
                    x2/=x3;
                pendn.push_back(x2);
            }
        }
        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;
}