Cod sursa(job #2050226)

Utilizator Mihai99Berechet Mihai Mihai99 Data 28 octombrie 2017 00:49:00
Problema Evaluarea unei expresii Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 2.6 kb
#include <iostream>
#include <stack>
#include <vector>
#include <fstream>
#include <cstring>
#define MAX 1000005
using namespace std;

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

// Operatori
// *    -1
// /    -2
// +    -3
// -    -4
// (    -5
// )    -6

struct element {
    bool o;
    double valoare;
};

stack<double> operatori;
vector<element> rezultat;
double k;

double transformare(char);
double rezolva();

int main() {

    char expresie[MAX];
    fin.getline(expresie, MAX);

    double numar = 0;

    for(int i = 0; i < strlen(expresie); ++i) {
        if(isdigit(expresie[i])) {
            numar *= 10;
            numar += expresie[i] - '0';
            if(!isdigit(expresie[i+1])) {
                element e;
                e.o = false;
                e.valoare = numar;
                rezultat.push_back(e);
                numar = 0;
            }
        }
        else {
            if(expresie[i] != ')') {
                double op = transformare(expresie[i]);
                if(!operatori.empty() && op != -5)
                while(operatori.top() >= op) {
                    element e; e.o = true; e.valoare = operatori.top();
                    rezultat.push_back(e);
                    operatori.pop();
                    if(operatori.empty()) break;
                }
                operatori.push(op);
            } else {
                while(operatori.top() != -5) {
                    element e; e.o = true; e.valoare = operatori.top();
                    rezultat.push_back(e);
                    operatori.pop();
                } operatori.pop();
            }
        }
    }

    while(!operatori.empty()) {
        element e; e.o = true; e.valoare = operatori.top();
        rezultat.push_back(e);
        operatori.pop();
    }

//    for(vector<element> :: iterator it = rezultat.begin();
//            it != rezultat.end(); ++it) {
//        cout<<(*it).valoare<<' ';
//    }

    k = rezultat.size() - 1;
    fout<<rezolva();

    return 0;
}

double rezolva() {
    if(!rezultat[k].o) return rezultat[k].valoare;

    double a, b, op = rezultat[k].valoare;
    --k;
    a = rezolva();
    --k;
    b = rezolva();

    if(op == -1) return a * b;
    if(op == -2) return b / a;
    if(op == -3) return a + b;
    if(op == -4) return b - a;
}

double transformare(char op) {
    double r;
    if(op == '*') return -1;
    if(op == '/') return -2;
    if(op == '+') return -3;
    if(op == '-') return -4;
    if(op == '(') return -5;
    if(op == ')') return -6;
    return r;
}