Pagini recente » Cod sursa (job #1882740) | Cod sursa (job #2301743) | Cod sursa (job #124417) | Cod sursa (job #1773235) | Cod sursa (job #2219086)
#include <bits/stdc++.h>
using namespace std;
ifstream fin ("evaluare.in");
ofstream fout ("evaluare.out");
char s[100005], Operator[100005];
int v[100005];
bool isNumber (int i)
{
return s[i] <= '9' && s[i] >= '0';
}
int createNumber (int & i)
{
int n = 0;
while (s[i] <= '9' && s[i] >= '0') n = n * 10 + (s[i] - '0'), i ++;
return n;
}
bool isOperator (int i)
{
return s[i] == '+' || s[i] == '-' || s[i] == '*' || s[i] == '/';
}
int makeOperation (int i, int a, int b)
{
int sum = 0;
if (Operator[i] == '+') sum = a + b;
if (Operator[i] == '-') sum = a - b;
if (Operator[i] == '*') sum = a * b;
if (Operator[i] == '/') sum = a / b;
return sum;
}
void parantheses (int & i)
{
int formerSum = 0, formerIdx = 0;
while (Operator[i] != ')') {
if (v[i] < 0) {
if (v[i] == -1 && formerSum == 0) formerSum = v[i - 1], formerIdx = i;
else if (v[i] == -1) formerSum = makeOperation(formerIdx, formerSum, v[i - 1]), formerIdx = i;
else if (v[i] == -2) v[i + 1] = makeOperation(i, v[i - 1], v[i + 1]);
else if (v[i] == -3) i ++, parantheses(i);
}
i ++;
}
v[i] = v[i - 1];
if (formerSum) v[i] = makeOperation(formerIdx, v[i - 1], formerSum);
}
int main()
{
fin.get(s, 100000);
int n = strlen(s), k = 0;
for (int i = 0; i < n; i ++) {
if (isNumber(i)) v[++k] = createNumber(i), i --, Operator[k] = ' ';
if (isOperator(i)) {
if (s[i] == '+' || s[i] == '-') v[++k] = -1;
else v[++k] = -2;
Operator[k] = s[i];
}
if (s[i] == '(' || s[i] == ')') v[++k] = -3, Operator[k] = s[i];
}
Operator[0] = ' ';
int i = 1, formerSum = 0, formerIdx = 0;
while (i <= k) {
if (v[i] < 0) {
if (v[i] == -1 && formerSum == 0) formerSum = v[i - 1], formerIdx = i;
else if (v[i] == -1) v[i + 1] = makeOperation(formerIdx, formerSum, v[i + 1]), formerIdx = 0, formerSum = 0;
else if (v[i] == -2) v[i + 1] = makeOperation(i, v[i - 1], v[i + 1]);
else if (v[i] == -3) i ++, parantheses(i);
}
i ++;
}
if (formerSum) v[i - 1] = makeOperation(formerIdx, formerSum, v[i - 1]);
fout << v[k];
return 0;
}