Cod sursa(job #569219)

Utilizator nandoLicker Nandor nando Data 1 aprilie 2011 10:03:45
Problema Evaluarea unei expresii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.32 kb
#include <iostream>
#include <fstream>
#include <stack>
using namespace std;

#define MAXN 100010
#define isDigit(d) ('0' <= (d) && (d) <= '9')
char buf[MAXN];

int prior [] = {0};

stack <pair<int, int> > expr, op;

void push_operator (int o)
{
    int a = expr.top ().second; expr.pop ();
    int b = expr.top ().second; expr.pop ();

    int c = 0;
    switch (o) {
        case 5:
            c = a + b;break;
        case 4:
            c = b - a;break;
        case 3:
            c = a * b;break;
        case 2:
            c = b / a;break;
    }

    expr.push (make_pair (0, c));
}

void push_stack (pair<int, int> p)
{
    if (p.first == 0) {
        expr.push (p);
    } else if (p.first == 1) {
        while (!op.empty () && op.top ().first != 6) {
            push_operator (op.top ().first);
            op.pop ();
        }
        op.pop ();
    } else {
        while (!op.empty () && op.top ().second >= p.second && op.top ().first != 6) {
            push_operator (op.top ().first);
            op.pop ();
        }
        op.push (p);
    }
}

int main ()
{
    FILE* fin = fopen ("evaluare.in", "r");
    FILE* fout = fopen ("evaluare.out", "w");

    fgets (buf, MAXN, fin);
    char *ptr = buf;

    int num = 0;
    while (*ptr != '\n' && *ptr != ' ' && *ptr != '\0') {
        switch (*ptr) {
            case '(':
                push_stack (make_pair (6, 3));
                break;
            case '+':
                push_stack (make_pair (5, 1));
                break;
            case '-':
                push_stack (make_pair (4, 1));
                break;
            case '*':
                push_stack (make_pair (3, 2));
                break;
            case '/':
                push_stack (make_pair (2, 2));
                break;
            case ')':
                push_stack (make_pair (1, 3));
                break;
            default:
                num = 0;
                while (isDigit (*ptr)) {
                    num = num * 10 + *ptr - '0';
                    ++ptr;
                }
                --ptr;
                push_stack (make_pair (0, num));
                break;
        }
        ++ptr;
    }

    while (!op.empty ()) {
        push_operator(op.top ().first);
        op.pop ();
    }

    fprintf (fout, "%d\n", expr.top ().second);

    fclose (fin);
    fclose (fout);
    return 0;
}