Pagini recente » Cod sursa (job #2304754) | Cod sursa (job #3004837) | Cod sursa (job #2735920) | Cod sursa (job #2491121) | Cod sursa (job #673037)
Cod sursa(job #673037)
#include <cstdio>
#include <string>
#include <iostream>
using namespace std;
int semne[100000], nr[100000], vfn, vfs;
string x;
inline int prioritate(char a)
{
if(a == '*' || a == '/')
return 1;
return 0;
}
inline void operatie(int &a, int &b)
{
if(semne[a] == '*') {
nr[b - 1] = nr[b - 1] * nr[b];
}
else if(semne[a] == '/') {
nr[b - 1] = nr[b - 1] / nr[b];
}
else if(semne[a] == '-') {
nr[b - 1] = nr[b - 1] - nr[b];
}
else if(semne[a] == '+') {
nr[b - 1] = nr[b - 1] + nr[b];
}
nr[b] = 0;
--b;
--a;
}
int main()
{
int i;
freopen ("evaluare.in", "r", stdin);
freopen ("evaluare.out", "w", stdout);
cin >> x;
for(i = 0; i < x.size(); ++i) {
if(x[i] >= '0' && x[i] <= '9') {
++vfn;
while(x[i] >= '0') {
nr[vfn] = nr[vfn] * 10 + x[i] - '0';
++i;
}
--i;
// cerr << nr[vfn] << ' ';
}
else if(x[i] == '(')
semne[++vfs] = '(';
else if(x[i] == '+' || x[i] == '-' || x[i] == '*' || x[i] == '/') {
while(prioritate(semne[vfs]) > prioritate(x[i]) && vfs > 0 && vfn > 1 && semne[vfs] != '(')
operatie(vfs, vfn);
semne[++vfs] = x[i];
}
else
while(semne[vfs] != '(' && vfs > 0 && vfn > 1) {
operatie(vfs, vfn);
--vfs;
}
}
while(vfs > 0 && vfn > 1)
operatie(vfs, vfn);
cerr << vfn;
printf("%d", nr[vfn]);
return 0;
}