Cod sursa(job #2060306)

Utilizator FunnyStockyMihnea Andreescu FunnyStocky Data 8 noiembrie 2017 06:25:02
Problema Evaluarea unei expresii Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 2.38 kb
#include <fstream>
#include <cstring>
#include <cctype>
using namespace std;
ifstream cin("evaluare.in");
ofstream cout("evaluare.out");
const int nm=100005;
char s[nm];
int stiva[nm],polo[nm],n,vf1,vf2;
int main()
{
    cin.getline(s,nm);
    n=strlen(s);
    for(int i=0;i<n;i++)
    {
        if(isdigit(s[i]))
        {
            if(i==0)
            {
                polo[++vf2]=s[i]-'0';
                continue;
            }
            if(isdigit(s[i-1]))
                polo[vf2]=polo[vf2]*10+s[i]-'0';
            else
                polo[++vf2]=s[i]-'0';
        }
        else
        {
            if(s[i]=='(')
            {
                stiva[++vf1]='(';
                continue;
            }
            if(s[i]==')')
            {
                while(stiva[vf1]!='(')
                {
                    vf2--;
                    if(stiva[vf1]=='+')
                        polo[vf2]=polo[vf2]+polo[vf2+1];
                    if(stiva[vf1]=='-')
                        polo[vf2]=polo[vf2]-polo[vf2+1];
                    if(stiva[vf1]=='*')
                        polo[vf2]=polo[vf2]*polo[vf2+1];
                    if(stiva[vf1]=='/')
                        polo[vf2]=polo[vf2]/polo[vf2+1];
                    vf1--;
                }
                vf1--;
                continue;
            }
            if(s[i]=='*' or s[i]=='/')
            {
                vf1++;
                stiva[vf1]=s[i];
                continue;
            }
            if(s[i]=='+' or s[i]=='-')
            {
                while(vf1 and (stiva[vf1]=='*' or stiva[vf1]=='/'))
                {
                    vf2--;
                    if(stiva[vf1]=='/')
                        polo[vf2]=polo[vf2]/polo[vf2+1];
                    if(stiva[vf1]=='*')
                        polo[vf2]=polo[vf2]*polo[vf2+1];
                    vf1--;
                }
                stiva[++vf1]=s[i];
            }
        }
    }
    while(vf1)
    {
        vf2--;
        if(stiva[vf1]=='+')
            polo[vf2]=polo[vf2]+polo[vf2+1];
        if(stiva[vf1]=='-')
            polo[vf2]=polo[vf2]-polo[vf2+1];
        if(stiva[vf1]=='*')
            polo[vf2]=polo[vf2]*polo[vf2+1];
        if(stiva[vf1]=='/')
            polo[vf2]=polo[vf2]/polo[vf2+1];
        vf1--;
    }
    cout<<polo[vf2];
    return 0;
}