Cod sursa(job #2219086)

Utilizator RaresLiscanLiscan Rares RaresLiscan Data 7 iulie 2018 09:51:54
Problema Evaluarea unei expresii Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 2.31 kb
#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;
}