Cod sursa(job #2061614)

Utilizator victoreVictor Popa victore Data 9 noiembrie 2017 15:56:24
Problema Evaluarea unei expresii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.4 kb
#include<bits/stdc++.h>

using namespace std;

const int NMAX = 1e5+5;

char s[NMAX];

vector<int> polo;
stack <char> op;

inline int prio(char ch)
{
    switch(ch)
    {
        case '*':
        case '/':
        case '%': return 2;

        case '+':
        case '-': return 1;

        default : return 0;
    }
}

inline int operatie(int nr1,int nr2,char ch)
{
    switch(ch)
    {
        case '*' : return nr1 * nr2;
        case '/' : return nr1 / nr2;
        case '+' : return nr1 + nr2;
        case '-' : return nr1 - nr2;
    }
}

int main()
{
    freopen("evaluare.in","r",stdin);
    freopen("evaluare.out","w",stdout);

    int n,i,nr1,nr2;

    gets(s+1);

    n = strlen(s+1);

    int nr;
    char ch;
    for(i=1;i<=n;++i)
    {

        if(!op.empty())
            ch = op.top();
        if(isdigit(s[i]))
        {
            nr = 0;
            while(i<=n && isdigit(s[i]))
            {
                nr = nr*10 + (s[i]-'0');
                ++i;
            }
            --i;
            polo.push_back(nr);
            continue;
        }
        if(s[i] == '(')
        {
            op.push(s[i]);
            continue;
        }
        if(s[i] == ')')
        {
            while(!op.empty() && op.top() != '(')
            {
                nr2 = polo[polo.size() - 1];
                polo.pop_back();
                nr1 = polo[polo.size() - 1];
                polo.pop_back();
                polo.push_back( operatie( nr1 , nr2 , op.top() ) );
                op.pop();
            }
            op.pop();
            continue;
        }

        if(op.empty() || prio( s[i] ) > prio( op.top() ) )
            op.push(s[i]);
        else
        {
            while(!op.empty() && prio(s[i]) <= prio(op.top() ) )
            {
                nr2 = polo[polo.size() - 1];
                polo.pop_back();
                nr1 = polo[polo.size() - 1];
                polo.pop_back();
                polo.push_back( operatie ( nr1 , nr2, op.top() ) );
                op.pop();
            }
            op.push(s[i]);
        }
    }

    while(!op.empty())
    {
        nr2 = polo[polo.size() - 1];
        polo.pop_back();
        nr1 = polo[polo.size() - 1];
        polo.pop_back();
        polo.push_back( operatie ( nr1 , nr2, op.top() ) );
        op.pop();
    }

    printf("%d",polo[0]);
}