Pagini recente » Cod sursa (job #89996) | Cod sursa (job #18373) | Cod sursa (job #2938734) | Cod sursa (job #2589573) | Cod sursa (job #2135712)
#include <fstream>
#include <stack>
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;
int values[LENGTH];
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] = doMath(operands.almostTop(), operands.top(), operators.pop());
}
operators.pop();
} else {
while (operators.isEmpty() && priority[operators.top()] >= priority[expression[i]] && operators.top() != '(') {
operands.values[--operands.size] = doMath(operands.almostTop(), operands.top(), operators.pop());
}
operators.push(expression[i++]);
}
}
out << operands.top() << "\n";
return 0;
}