Pagini recente » AndrewTheGreat | Cod sursa (job #1726366) | Cod sursa (job #2006151) | Istoria paginii utilizator/mihaicosmin2011 | Cod sursa (job #3166564)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
FILE *fin, *fout;
int evaluate_stack(vector<int> &numbers, vector<char> &operators) {
int result = numbers.back();
numbers.pop_back();
while (!numbers.empty()) {
char op = operators.back();
operators.pop_back();
if (op == '+')
result += numbers.back();
else
result -= numbers.back();
numbers.pop_back();
}
return result;
}
int compute() {
vector<int> numbers;
vector<char> operators;
int number;
char c = fgetc(fin);
while (c != ')' && c != EOF) {
if (c == ' ') {
c = fgetc(fin);
continue;
}
if (c == '+' || c == '-' || c == '*' || c == '/') {
operators.push_back(c);
c = fgetc(fin);
continue;
}
if (c == '(') {
number = compute();
c = fgetc(fin);
} else if (c >= '0' && c <= '9') {
number = 0;
while (c >= '0' && c <= '9') {
number = number * 10 + (c - '0');
c = fgetc(fin);
}
}
if ((int)numbers.size() > 0) {
if (operators.back() == '*') {
number = numbers.back() * number;
operators.pop_back();
numbers.pop_back();
}
else if (operators.back() == '/') {
number = numbers.back() / number;
operators.pop_back();
numbers.pop_back();
}
}
numbers.push_back(number);
}
return evaluate_stack(numbers, operators);
}
int main()
{
fin = fopen("evaluare.in", "r");
fout = fopen("evaluare.out", "w");
fprintf(fout, "%d\n", compute());
fclose(fin);
fclose(fout);
return 0;
}