Pagini recente » Cod sursa (job #2092837) | Cod sursa (job #2715082) | Cod sursa (job #743829) | Cod sursa (job #437018) | Cod sursa (job #2042015)
#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;
}