Pagini recente » Cod sursa (job #2744907) | Cod sursa (job #910235) | Cod sursa (job #689947) | Cod sursa (job #330675) | Cod sursa (job #2787743)
#include <stdio.h>
#include <string.h>
#define MAX_S 100000
char s[MAX_S];
int n;
int sIndex;
int factors[MAX_S];
int factorsSize;
char operators[MAX_S];
int operatorsSize;
void pushOperator(char op) {
if (op == '*' || op == '/' || op == '+' || op == '-' || op == '(' || op == ')')
operators[operatorsSize++] = op;
}
char popLastOperator() {
return operatorsSize ? operators[--operatorsSize] : '+';
}
char lastOperator() {
return operatorsSize ? operators[operatorsSize - 1] : '+';
}
bool hasFactors() {
return factorsSize > 0;
}
void pushFactor(int factor) {
factors[factorsSize++] = factor;
}
int lastFactor() {
return factorsSize ? factors[factorsSize - 1] : 0;
}
int popLastFactor() {
return factorsSize ? factors[--factorsSize] : 0;
}
int factor() {
int number;
number = 0;
while (s[sIndex] >= '0' && s[sIndex] <= '9') {
number = number * 10 + s[sIndex] - '0';
++sIndex;
}
return number;
}
int main() {
FILE *fin, *fout;
fin = fopen("evaluare.in", "r");
fout = fopen("evaluare.out", "w");
int result;
char op;
fgets(s, MAX_S, fin);
n = strlen(s);
sIndex = 0;
pushOperator('+');
while (sIndex < n) {
while (s[sIndex] == '(') {
pushOperator('(');
pushOperator('+');
++sIndex;
}
op = lastOperator();
if (op == '*') {
pushFactor(popLastFactor() * factor());
popLastOperator();
} else if (op == '/') {
pushFactor(popLastFactor() / factor());
popLastOperator();
} else if (op == '+' || op == '-')
pushFactor(factor());
while (s[sIndex] == ')') {
result = 0;
op = popLastOperator();
while (op != '(') {
if (op == '+')
result += popLastFactor();
else
result -= popLastFactor();
op = popLastOperator();
}
if (lastOperator() == '*') {
result = popLastFactor() * result;
popLastOperator();
} else if (lastOperator() == '/') {
result = popLastFactor() / result;
popLastOperator();
}
pushFactor(result);
++sIndex;
}
pushOperator(s[sIndex++]);
}
result = 0;
while (hasFactors()) {
if (popLastOperator() == '+')
result += popLastFactor();
else
result -= popLastFactor();
}
fprintf(fout, "%d\n", result);
fclose(fin);
fclose(fout);
return 0;
}