Cod sursa(job #2302297)

Utilizator cyg_vladioanBirsan Vlad cyg_vladioan Data 14 decembrie 2018 08:54:37
Problema Evaluarea unei expresii Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.56 kb
#include <cstdio>
#include <string>
#include <cctype>
#include <iostream>
#include <algorithm>
using namespace std;
const int NINF = -2.e9 - 1;
long long fp[100005] , ok;
char op[100005];
string s , s1;
inline int priority(char ch)
{
    if(ch == '(')
        return -1;
    if(ch == ')')
        return -2;
    if(ch == '+' || ch == '-')
        return 1;
    return 2;
}
inline void modifica(int top1 , int top2)
{
    if(op[top2] == '*')
        fp[top1 - 1] = fp[top1 - 1] * fp[top1];
    else if(op[top2] == '/')
    {
        if(fp[top1] == 0)
            ok = 0;
        else
            fp[top1 - 1] = fp[top1 - 1] / fp[top1];
    }
    else if(op[top2] == '%')
    {
        if(fp[top1] == 0)
            ok = 0;
        else
            fp[top1 - 1] = fp[top1 - 1] % fp[top1];
    }
    else if(op[top2] == '+')
        fp[top1 - 1] = fp[top1 - 1] + fp[top1];
    else
        fp[top1 - 1] = fp[top1 - 1] - fp[top1];
}
inline long long formapoloneza()
{
    int i , top1 , top2 , nr;
    top1 = top2 = 0;
    ok = 1;
    for(i = 0 ; i <= s.length() ; i ++)
        if(isdigit(s[i]))
        {
            if(i > 1 && s[i - 1] == '-' && s[i - 2] == '(')
                fp[++ top1] = 0;
            nr = 0;
            while(i < s.length() && isdigit(s[i]))
            {
                nr = nr * 10 + s[i] - '0';
                i ++;
            }
            i --;
            fp[++ top1] = nr;
        }
        else
        {
            if(priority(s[i]) == -1)
                op[++ top2] = s[i];
            else if(priority(s[i]) == -2)
            {
                while(op[top2] != '(')
                {
                    modifica(top1 , top2);
                    if(ok == 0)
                        return NINF;
                    top1 --;
                    top2 --;
                }
                top2 --;
            }
            else
            {
                while(top2 > 0 && priority(s[i]) <= priority(op[top2]) && priority(op[top2]) != -1)
                {
                    modifica(top1 , top2);
                    if(ok == 0)
                        return NINF;
                    top1 --;
                    top2 --;
                }
                op[++ top2] = s[i];
            }
        }
    return fp[1];
}
int main()
{
    freopen("evaluare.in" , "r" , stdin);
    freopen("evaluare.out" , "w" , stdout);
    int i;
    s.push_back('(');
    getline(cin , s1);
    s = s + s1;
    s.push_back(')');
    printf("%d\n" , formapoloneza());
    return 0;
}