Cod sursa(job #1207383)

Utilizator mariusn01Marius Nicoli mariusn01 Data 12 iulie 2014 21:35:45
Problema Evaluarea unei expresii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.65 kb
#include <fstream>
#include <cstring>

#define DIM 100010

using namespace std;

char V[DIM];
char S[DIM];
int O[DIM];
int stack[DIM];
char p[256];

int x, y, i, dS, dO, k;

ifstream fin("evaluare.in");
ofstream fout("evaluare.out");

int main() {
    p['+'] = p['-'] = 1;
    p['*'] = p['/'] = 2;

    fin>>V;

    for (i=0;V[i]!=0;i++) {
        if (V[i] == '(') {
            S[++dS] = '(';
            continue;
        }
        if (V[i] == ')') {
            while (S[dS] != '(') {
                O[++dO] = -S[dS];
                dS--;
            }
            dS--;
            continue;
        }
        if (V[i] >= '0' && V[i] <= '9') {
            dO++;
            O[dO] = 0;
            while (V[i] >= '0' && V[i] <= '9') {
                O[dO] = O[dO] * 10 + V[i]-'0';
                i++;
            }
            i--;
            continue;
        }

        if (strchr("+-*/",V[i])) {
            while (dS!=0 && S[dS]!='(' && p[ V[i] ] <= p[ S[dS] ]) {
                O[++dO] = -S[dS--];
            }
            S[++dS] = V[i];
        }

    }

    while (dS) {
        O[++dO] = -S[dS];
        dS--;
    }

    for (i=1;i<=dO;i++) {
        if (O[i] >= 0) {
            stack[++k] = O[i];
        } else {
            x = stack[k-1];
            y = stack[k];
            k--;
            if (-O[i] == '+')
                stack[k] = x+y;
            if (-O[i] == '-')
                stack[k] = x-y;
            if (-O[i] == '*')
                stack[k] = x*y;
            if (-O[i] == '/')
                stack[k] = x/y;
        }
    }

    fout<<stack[1];

    return 0;
}