Cod sursa(job #1824315)

Utilizator AnduB08Boldisor Andu AnduB08 Data 7 decembrie 2016 18:22:30
Problema Evaluarea unei expresii Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 2.98 kb
#include <fstream>
#include <cstring>
using namespace std;
ifstream f("evaluare.in");
ofstream g("evaluare.out");
char c[100010],st1[100010];
int n,i,vf,vff,x,y,nr,st2[100010];
int main()
{
    f.getline(c+1,100010);
    c[0]='(';
    st1[1]='(';
    vf=1;
    n=strlen(c+1);
    c[n+1]=')';
    for(i=1;i<=n+1;++i)
    {
        if(c[i]==')')
        {
            while(st1[vf]!='('){
            if(st1[vf]=='+')
            {
                vf--;
                x=st2[vff-1];
                y=st2[vff];
                vff=vff-2;
                st2[++vff]=x+y;
            }
            else
            {
                if(st1[vf]=='-')
                {
                vf--;
                x=st2[vff-1];
                y=st2[vff];
                vff-=2;
                st2[++vff]=x-y;
                }
                else
                {
                    if(st1[vf]=='*')
                    {

                      vf--;
                      x=st2[vff-1];
                      y=st2[vff];
                      vff-=2;
                      st2[++vff]=x*y;
                    }
                    else
                    {
                        if(st1[vf]=='/')
                        {

                           vf--;
                           x=st2[vff-1];
                           y=st2[vff];
                           vff-=2;
                           st2[++vff]=x/y;
                        }
                    }

                }
            }
            }
            vf--;
        }
        else
        {
            if(c[i]=='+')
            {
                if(st1[vf]=='*' || st1[vf]=='/')
                {
                    x=st2[vff-1];
                    y=st2[vff];
                    vff-=2;
                    if(st1[vf]=='*')
                        st2[++vff]=x*y;
                    else
                        st2[++vff]=x/y;
                    vf--;
                }
                st1[++vf]='+';
            }
            if(c[i]=='-')
            {
                if(st1[vf]=='*' || st1[vf]=='/')
                {
                    x=st2[vff-1];
                    y=st2[vff];
                    vff-=2;
                    if(st1[vf]=='*')
                        st2[++vff]=x*y;
                    else
                        st2[++vff]=x/y;
                    vf--;
                }
                st1[++vf]='-';
            }
            if(c[i]=='*')
                st1[++vf]='*';
            if(c[i]=='/')
                st1[++vf]='/';
            if(c[i]=='(')
                st1[++vf]='(';
            if(c[i]-'0'>=0 && c[i]-'0'<10)
            {
                nr=0;
                while(c[i]-'0'>=0 && c[i]-'0'<10)
                {
                    nr=nr*10+c[i]-'0';
                    ++i;
                }
                st2[++vff]=nr;
            --i;
            }
        }
    }
    g<<st2[vff];
    return 0;
}