Cod sursa(job #2042015)

Utilizator Mihai99Berechet Mihai Mihai99 Data 17 octombrie 2017 22:51:00
Problema Evaluarea unei expresii Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 2.77 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <stack>
#include <cstring>
using namespace std;

ifstream fin("evaluare.in");
ofstream fout("evaluare.out");


char expresie[100005];
vector<int> numere, operatii, paranteze;
int nrp = -1;

int calcul_expresie(int,int);
int numar(int&);

int main() {
    fin.getline(expresie, 100005);

    stack<int> pcurente;
    int k = 0;
    for(int i = 0; i < strlen(expresie); ++i) {
        if(expresie[i] == '(') {
            pcurente.push(k++);
            paranteze.push_back(0);
        }
        if(expresie[i] == ')') {
            paranteze[pcurente.top()] = i;
            pcurente.pop();
        }
    }

//    for(vector<int> :: iterator it = paranteze.begin(); it != paranteze.end(); ++it)
//        cout<<*it<<' ';

    fout<<calcul_expresie(0, strlen(expresie));

    fin.close();
    fout.close();
    return 0;
}

int calcul_expresie(int a, int b) {
    int rez = 0, p = 1, numar_curent;
    bool produs = false, divide = false, suma = false, scadere = false;

    if(expresie[a] == '(') {
        int j = ++nrp;
        numar_curent = calcul_expresie(a + 1, paranteze[j]);
        a = paranteze[j];
    } else numar_curent = numar(a);

    for(int i = a+1; ; ++i) {
        if(expresie[i] != '*' && expresie[i] != '/' && !isdigit(i)) {
            if(scadere) {
                scadere = false;
                numar_curent *= -1;
            }
            suma = false;

            if(produs) {
                p *= numar_curent;
                rez += p;
                p = 1;
                produs = false;
            } else if(divide) {
                p /= numar_curent;
                rez += p;
                p = 1;
                divide = false;
            } else {
                rez += numar_curent;
            }

            if(expresie[i] == '+') {
                suma = true;
            } else if(expresie[i] == '-') scadere = true;
        } else if(expresie[i] == '*' || expresie[i] == '/') {
            if(divide) {
                p /= numar_curent;
                divide = false;
            } else {
                p *= numar_curent;
                produs = false;
            }

            if(expresie[i] == '*') produs = true;
            else divide = true;
        }
        ++i;
        if(expresie[i] == '(') {
            int j = ++nrp;
            numar_curent = calcul_expresie(i + 1, paranteze[j]);
            i = paranteze[j];
        } else if(isdigit(expresie[i])) numar_curent = numar(i);
        else break;
    }

    return rez;
}

int numar(int &a) {
    int numar = 0;
    while(isdigit(expresie[a])) {
        numar *= 10;
        numar += expresie[a++] - '0';
    } --a;
    return numar;
}