Cod sursa(job #1848804)

Utilizator RobybrasovRobert Hangu Robybrasov Data 16 ianuarie 2017 17:53:07
Problema Evaluarea unei expresii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.82 kb
#include <cstdio>
#include <iostream>
#include <stack>    
#define MAX_S 100000

using namespace std;

char S[MAX_S];
stack<char> OP;
stack<int> NUM;

int readNumber(char* &p) {
    int n = 0;
    for (; *p >= '0' && *p <= '9'; ++p)
        n = 10 * n + *p - '0';
    return n;
}

// Resolves an operator on the result stack, performing whatever operations to
// the output stack that are needed.
void pushOperator(char p) {
    int b = NUM.top();
    NUM.pop();
    int a = NUM.top();
    NUM.pop();
    switch (p) {
        case '+':
            NUM.push(a + b);
            break;
        case '-':
            NUM.push(a - b);
            break;
        case '*':
            NUM.push(a * b);
            break;
        case '/':
            NUM.push(a / b);
    }
}

inline int prec(char p) {
    switch(p) {
        case '(':
            return 0;
        case '-':
        case '+':
            return 1;
        case '*':
        case '/':
            return 2;
    }
    return 2;
}

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

    while (*p != '\n') {
        if (*p >= '0' && *p <= '9') {
            int n = readNumber(p);
            NUM.push(n);
        } else {
            if (*p != '(' && *p != ')') {
                for (; !OP.empty() && prec(*p) <= prec(OP.top()); OP.pop())
                    pushOperator(OP.top());
                OP.push(*p);
            } else if (*p == '(') {
                OP.push(*p);
            } else if (*p == ')') {
                for (; OP.top() != '('; OP.pop())
                    pushOperator(OP.top());
                OP.pop();
            }
            ++p;
        }
    }
    for (; !OP.empty(); OP.pop())
        pushOperator(OP.top());

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

    return 0;
}