Cod sursa(job #2188471)

Utilizator vladsirbu23Vlad Sirbu vladsirbu23 Data 27 martie 2018 10:15:55
Problema Evaluarea unei expresii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 4.37 kb
#include <iostream>
#include <fstream>
#include <string>
#include <stack>
#define maxim 1000000000
using namespace std;
ifstream fin("evaluare.in");
ofstream fout("evaluare.out");
string s;
char c;
int i,l,fp[100010],val,k,k2,st[100010],j,i1,i2;
stack <int> q;
int main()
{
    //poland isnt a real country
    //poland cant into space
    //danzig and pozen are german clay
    fin>>s;
    l=s.size();
    val=0;
    k=0;
    k2=0;
    for(i=0; i<l; i++)
    {
        c=s[i];
        if(c<='9'&&c>='0') val=val*10+(int) (c-'0');
        else
        {
            if(s[i-1]<='9'&&s[i-1]>='0')
            {
                k++;
                fp[k]=val;
                val=0;
            }
            if(c=='+')
            {
                k2++;
                st[k2]=maxim+1;
                while(st[k2-1]-maxim>=1&&st[k2-1]-maxim<=4)
                {
                    k++;
                    fp[k]=st[k2-1];
                    st[k2-1]=st[k2];
                    k2--;
                }
            }
            else
            {
                if(c=='-')
                {
                    k2++;
                    st[k2]=maxim+2;
                    while(st[k2-1]-maxim>=1&&st[k2-1]-maxim<=4)
                    {
                        k++;
                        fp[k]=st[k2-1];
                        st[k2-1]=st[k2];
                        k2--;
                    }
                }
                else
                {
                    if(c=='*')
                    {
                        k2++;
                        st[k2]=maxim+3;
                        if(st[k2-1]-maxim>=3&&st[k2-1]-maxim<=4)
                        {
                            k++;
                            fp[k]=st[k2-1];
                            st[k2-1]=st[k2];
                            k2--;
                        }
                    }
                    else
                    {
                        if(c=='/')
                        {
                            k2++;
                            st[k2]=maxim+4;
                            if(st[k2-1]-maxim>=3&&st[k2-1]-maxim<=4)
                            {
                                k++;
                                fp[k]=st[k2-1];
                                st[k2-1]=st[k2];
                                k2--;
                            }
                        }
                        else
                        {
                            if(c=='(')
                            {
                                k2++;
                                st[k2]=maxim+5;
                            }
                            else
                            {
                                while(st[k2]!=maxim+5)
                                {
                                    k++;
                                    fp[k]=st[k2];
                                    st[k2]=0;
                                    k2--;
                                }
                                st[k2]=0;
                                k2--;
                            }
                        }
                    }
                }
            }
        }
    }
    if(s[l-1]<='9'&&s[i-1]>='0')
    {
        k++;
        fp[k]=val;
        val=0;
    }
    //poland is such a joke...
    while(k2!=0)
    {
        k++;
        fp[k]=st[k2];
        k2--;
    }
    for(i=1; i<=k; i++)
    {
        if(fp[i]-maxim>=1&&fp[i]-maxim<=4)
        {

            i2=q.top();
            q.pop();
            i1=q.top();
            q.pop();
            if(fp[i]-maxim==1)
            {
                q.push(i1+i2);
            }
            else
            {
                if(fp[i]-maxim==2)
                {
                    q.push(i1-i2);
                }
                else
                {
                    if(fp[i]-maxim==3)
                    {
                        q.push(i1*i2);
                    }
                    else
                    {
                        if(fp[i]-maxim==4)
                        {
                            q.push(i1/i2);
                        }
                    }
                }
            }
        }
        else
        {
            q.push(fp[i]);
        }

    }
    fout<<q.top();
}