Cod sursa(job #1317898)

Utilizator AlxzAlex Cremeneanu Alxz Data 15 ianuarie 2015 12:57:01
Problema Evaluarea unei expresii Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 2.08 kb
#include <iostream>
#include <fstream>
#include <string.h>
using namespace std;
ifstream fin("evaluare.in");
ofstream fout("evaluare.out");
int n,i,nr,OK,od[100001],vr,vf;
char s[100001],pr[126],op[100001];
int calcul(char ch,int a,int b)
{
    if (ch=='+')
        return a+b;
    if (ch=='-')
        return a-b;
    if (ch=='*')
        return a*b;
    if (ch=='/')
        return a/b;
}
int main()
{
    fin >>s+1;
    n=strlen(s+1);
    pr['+']=pr['-']=1;
    pr['*']=pr['/']=2;
    for(i=1;i<=n;i++)
    {
        if(s[i]>='0'&&s[i]<='9')
        {
            OK=1;
            nr=nr*10+(s[i]-'0');
        }
        else
        {
            if(s[i]=='(')
               {
                   if(OK==1)
                    {
                        od[++vr]=nr;
                        nr=0;OK=0;
                    }
                   op[++vf]=s[i];
               }
            else
                if(s[i]==')')
                {
                    if(OK==1)
                    {
                        od[++vr]=nr;
                        nr=0;OK=0;
                    }
                    while (op[vf]!='(')
                    {
                        od[vr-1]=calcul(op[vf],od[vr-1],od[vr]);
                        vf--;
                        vr--;


                    }
                    vf--;
                }
            else
            {
                if(OK==1)
                    {
                        od[++vr]=nr;
                        nr=0;OK=0;
                    }
                if(vf>0&&pr[s[i]]<=pr[op[vf]])
                {
                    od[vr-1]=calcul(op[vf],od[vr-1],od[vr]);
                    vr--;
                    vf--;
                }
               op[++vf]=s[i];
            }
        }
    }

    while(vf>0)
        {
            if(OK==1)
            {
                od[++vr]=nr;
                nr=0;OK=0;
            }
            od[vr-1]=calcul(op[vf],od[vr-1],od[vr]);
            vf--;
            vr--;
        }
    fout<<od[1];
    return 0;
}