Pagini recente » Cod sursa (job #3237021) | Cod sursa (job #1353110) | Borderou de evaluare (job #794920) | Borderou de evaluare (job #2623786) | Cod sursa (job #3177304)
#include <fstream>
#include <stack>
#include <map>
#define INF 1e9 + 5
using namespace std;
ifstream fin("evaluare.in");
ofstream fout("evaluare.out");
string input;
stack<int> calculations;
stack<char> operations;
stack<int> depth;
map<char, int> priority;
void compress() {
int temp = calculations.top();
calculations.pop();
if (calculations.top() == INF)
calculations.top() = temp;
else {
switch (operations.top())
{
case '+':
calculations.top() += temp;
break;
case '*':
calculations.top() *= temp;
break;
case '/':
calculations.top() /= temp;
break;
}
operations.pop();
depth.pop();
}
}
int main()
{
priority['+'] = 2;
priority['*'] = 1;
priority['/'] = 1;
calculations.push(INF);
int count = 0;
bool numberExists = false;
bool negative = false;
fin >> input;
for (int i = 0; i < input.size(); i++) {
if (isdigit(input[i])) {
count *= 10;
count += input[i] - '0';
numberExists = true;
if (negative) {
count *= -1;
negative = false;
}
}
else if (numberExists) {
if (input[i] != ')' && !operations.empty()) {
if (priority[input[i]] < priority[operations.top()] && calculations.size() == depth.top()) {
calculations.push(INF);
}
}
calculations.push(count);
compress();
count = 0;
numberExists = false;
if (input[i] != ')' && !operations.empty()) {
if (priority[input[i]] > priority[operations.top()] && calculations.size() > 1 && calculations.size() == depth.top()) {
compress();
}
}
}
if (input[i] == '(') {
calculations.push(INF);
}
if (input[i] == ')') {
if (i + 1 != input.size()) {
if (!operations.empty()) {
if (priority[input[i + 1]] >= priority[operations.top()] && calculations.size() - 1 == depth.top())
compress();
}
}
else {
compress();
}
}
if (input[i] == '+') {
operations.push('+');
depth.push(calculations.size());
}
if (input[i] == '-') {
operations.push('+');
depth.push(calculations.size());
negative = true;
if (calculations.top() == INF)
calculations.top() = 0;
}
if (input[i] == '*') {
operations.push('*');
depth.push(calculations.size());
}
if (input[i] == '/') {
operations.push('/');
depth.push(calculations.size());
}
}
if (numberExists) {
calculations.push(count);
compress();
count = 0;
numberExists = false;
}
while (calculations.size() > 1)
compress();
fout << calculations.top();
}