Pagini recente » Cod sursa (job #1346648) | Cod sursa (job #864814) | Cod sursa (job #1663071) | Statistici Lorincz Tamas (Xeen3m) | Cod sursa (job #1513525)
#include <cstdio>
#include <cstring>
#define MAX 1000000005
using namespace std;
char a[100001];
struct abc
{
int pr;
int num;
char c;
} v[100001];
struct Nod {
int num;
char c;
Nod *ls;
Nod *ld;
};
typedef Nod *PNod;
int poz;
inline int cauta(int a,int b){
int minn = MAX,minni;
for(int i = a; i <= b; i++)
if(v[i].pr <= minn){
minn = v[i].pr;
minni = i;
}
return minni;
}
void mache(int a, int b, PNod &p)
{
int poz = cauta(a,b);
p = new Nod;
if(a != b) p -> c = v[poz].c;
else p -> num = v[poz].num, p -> ls = NULL, p -> ld = NULL;
if(a <= poz - 1) mache(a,poz - 1,p -> ls);
if(poz + 1 <= b) mache(poz + 1,b,p -> ld);
}
int eval(PNod p)
{ if(p -> c == '+') return eval(p -> ls) + eval(p -> ld);
else if(p -> c == '-') return eval(p -> ls) - eval(p -> ld);
else if(p -> c == '*') return eval(p -> ls) * eval(p -> ld);
else if(p -> c == '/') return eval(p -> ls) / eval(p -> ld);
else return p -> num;
}
int main()
{
freopen("evaluare.in","r",stdin);
freopen("evaluare.out","w",stdout);
int num,vf = 0;
scanf("%s",&a);
int l = strlen(a);
int p = 0;// fac vectorul de prioritati
for(int i = 0; i < l; i++)
{
if(a[i] == '(') p += 10;
else if(a[i] == ')') p -= 10;
else
{
if(a[i] == '*' or a[i] == '/')
v[++vf].pr = 10 + p, v[vf].c = a[i];
else if(a[i] == '+' or a[i] == '-')
v[++vf].pr = 1 + p, v[vf].c = a[i];
else
{
num = 0;
while(a[i] >= '0') num = num * 10 + a[i] - '0',i++;
i--;
v[++vf].pr = MAX;
v[vf].num = num;
}
}
}
PNod r = 0;
mache(1,vf,r);
printf("%d",eval(r));
return 0;
}