Cod sursa(job #1364188)

Utilizator gabrielinelusGabriel-Robert Inelus gabrielinelus Data 27 februarie 2015 15:25:44
Problema Evaluarea unei expresii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.74 kb
#include <cstdio>
#include <stack>
#include <cstring>

using namespace std;
char c[100005];
stack<int> S2;
stack<pair<char,int> > S1;
int N;

void Read()
{
    scanf("%s",c+2);
    c[0] = '#';
    c[1] = '(';
    N = strlen(c + 1);
    c[N + 1] = ')';
    c[N + 2] = 0;
    ++N;
}

int prio(char c)
{
    if(c == '+' || c == '-')
        return 1;
    if(c == '*' || c == '/')
        return 2;
}

void Scoate(int k)
{
    int rez = 0,x,y;
    while( (S1.top().first != '(' && c[k] ==')') || S1.top().second >= prio(c[k]))
    {
        y = S2.top(); S2.pop();
        x = S2.top(); S2.pop();
        if(S1.top().first == '+')
            S2.push(x+y);
        else
            if(S1.top().first == '-')
                S2.push(x-y);
            else
                if(S1.top().first == '*')
                    S2.push(x*y);
                else
                    S2.push(x/y);
        S1.pop();
    }
}

void Dijkstra2S()
{
    for(int i = 1; i <= N; ++i)
    {
        if(c[i] == '(')
        {
            S1.push(make_pair('(',-1));
            continue;
        }
        if('0' <= c[i] && c[i] <= '9'){
            int x = c[i] - 48;;
            while('0' <= c[i+1] && c[i+1] <= '9'){
                ++i;
                x = x * 10 + c[i] - 48;
            }
            S2.push(x);
            continue;
        }
        if(c[i] == ')')
        {
            Scoate(i);
            S1.pop();/// scoatem '('
            continue;
        }
        Scoate(i);
        S1.push(make_pair(c[i],prio(c[i])));
    }
    printf("%d\n",S2.top());
}

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

    Read();
    Dijkstra2S();


    return 0;
}