Pagini recente » Cod sursa (job #1629171) | Cod sursa (job #2887811) | Cod sursa (job #3166677) | Cod sursa (job #2438748) | Cod sursa (job #2135722)
#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;
}