Cod sursa(job #2135722)

Utilizator PondorastiAlex Turcanu Pondorasti Data 19 februarie 2018 09:41:24
Problema Evaluarea unei expresii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.85 kb
#include <fstream>

using namespace std;

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

const int LENGTH = 1e5;
int i, priority[50], number;
string expression;

class STACK
{
public:
    int size = 0;
    int values[LENGTH + 2];
    
    bool isEmpty() { return size; }
    int top() { return values[size]; }
    int almostTop() { return values[size - 1]; }
    int pop() { return values[size--]; }
    void push(int number) { values[++size] = number; }
}operators, operands;

inline bool isDigit(char c) {
    return ('0' <= c && c <= '9');
}

inline int doMath(int a, int b, int Operator) {
    switch (Operator) {
        case '+': return a + b;
        case '-': return a - b;
        case '/': return a / b;
        case '*': return a * b;
    }
    return -1;
}

int main() {
    priority['+'] = priority['-'] = 1;
    priority['/'] = priority['*'] = 2;
    priority['('] = 3;
    
    in >> expression;
    while (i <= expression.size()) {
        if (isDigit(expression[i])) {
            number = 0;
            do {
                number = number * 10 + (expression[i++] - '0');
            } while (isDigit(expression[i]));
            operands.push(number);
        } else if (expression[i] == ')') {
            ++i;
            while (operators.top() != '(') {
                operands.values[operands.size - 1] = doMath(operands.almostTop(), operands.top(), operators.pop());
                operands.pop();
            }
            operators.pop();
        } else {
            while (operators.isEmpty() && priority[operators.top()] >= priority[expression[i]] && operators.top() != '(') {
                operands.values[operands.size - 1] = doMath(operands.almostTop(), operands.top(), operators.pop());
                operands.pop();
            }
            operators.push(expression[i++]);
        }
    }
    out << operands.top() << "\n";
    return 0;
}