Cod sursa(job #597254)

Utilizator cosmyoPaunel Cosmin cosmyo Data 21 iunie 2011 16:16:55
Problema Evaluarea unei expresii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.11 kb
#include <cstdio>
#include <cstring>
using namespace std;
char s[100005];
int x[100005], n;
char op[] = {"0+-*/()"};
int ord[7] = {0, 0 , 0, 1, 1, 2, 2};

int chartoint(int &i) {
    int nr = 0;
    while(s[i] <= '9' && s[i] >= '0' && i < n){
        nr = nr * 10 + s[i] - '0';
        ++i;
    }
    return nr;
}

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

    int i = 0, nr = 0, sign;
    int stack[100001];
    n = strlen(s);
    int    vf = 0;
    while(i < n) {
        if(s[i] >= '0' && s[i] <= '9')
            x[++nr] = chartoint(i), --i;
        int j;

        for(j = 1; j <= 4; ++j)
            if(s[i] == op[j]) {
                while(stack[vf]!= 5 && ord[j] <= ord[stack[vf]] && vf){
                    x[++nr] = -stack[vf];
                    --vf;
                }
                stack[++vf] = j;
            }
        if(s[i] == '(')
            stack[++vf] = 5;
        if(s[i] == ')') {
            while(stack[vf] != 5) {
                  x[++nr] = -stack[vf];
                  --vf;
            }
            --vf;
        }
        ++i;
    }
    while(vf){
        x[++nr] = -stack[vf];
        --vf;
    }
   // return 0;
    vf = 0;
    for(i = 1; i <= nr; ++i) {
        if(x[i] >= 0)
            stack[++vf] = x[i];
        else {
            int a = stack[vf];
            --vf;
            int b = stack[vf];int  rez = 0;
            --vf;
       //     printf("%d %d ", a, b);
            switch ( x[i] ) {
                case -1 :
                    rez = a + b;
                    break;
                case -2 :
                    rez = b - a;
                    break;
                case -3 :
                    rez = a * b;
                    break;
                case -4 :
                    rez = b / a;
                    break;

            }
      //      printf("%d\n", rez);
            stack[++vf] = rez;
        }
    }
    printf("%d\n", stack[1]);
 //   for(i = 1;i <= nr; ++i)
 //  printf("%d\n", x[i]);

   return 0;
}