Pagini recente » Cod sursa (job #2783590) | Cod sursa (job #2584713) | Cod sursa (job #2949628) | Cod sursa (job #3229328) | Cod sursa (job #3293207)
#include <fstream>
using namespace std;
ifstream fin("evaluare.in");
ofstream fout("evaluare.out");
int st1[100001], pr[256]; // st1 este stiva ce retine operanzii, iar pr retine prioritatile operatorilor
char expr[100001], st2[100001]; // st2 este stiva ce retine parantezele si operatorii
int operatie(int a, char op, int b) {
if (op == '+')
return a + b;
if (op == '-')
return a - b;
if (op == '*')
return a * b;
return a / b;
}
int main() {
pr['('] = 0;
pr['+'] = pr['-'] = 1;
pr['*'] = pr['/']= 2;
fin >> expr;
int vf1 = 0, vf2 = 0;
for (int i = 0; expr[i] != 0; i++)
if (expr[i] >= '0' && expr[i] <= '9') {
int nr = 0;
while (expr[i] >= '0' && expr[i] <= '9') {
nr = nr * 10 + expr[i] - '0';
i++;
}
i--;
st1[++vf1] = nr;
}
else
if (expr[i] == '(')
st2[++vf2] = '(';
else
if (expr[i] == ')') {
while (st2[vf2] != '(') {
int nr = operatie(st1[vf1-1], st2[vf2], st1[vf1]);
vf1 -= 2;
vf2--;
st1[++vf1] = nr;
}
vf2--;
}
else {
while (vf2 > 0 && pr[st2[vf2]] >= pr[expr[i]]) {
int nr = operatie(st1[vf1-1], st2[vf2], st1[vf1]);
vf1 -= 2;
vf2--;
st1[++vf1] = nr;
}
st2[++vf2] = expr[i];
}
while (vf2 > 0) {
int nr = operatie(st1[vf1-1], st2[vf2], st1[vf1]);
vf1 -= 2;
vf2--;
st1[++vf1] = nr;
}
fout << st1[vf1];
return 0;
}