Pagini recente » Cod sursa (job #2524401) | Cod sursa (job #616500) | Cod sursa (job #575824) | Cod sursa (job #579602) | Cod sursa (job #2050226)
#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;
}