Pagini recente » Cod sursa (job #1646722) | Cod sursa (job #2477657) | Cod sursa (job #2536590) | Cod sursa (job #119428) | Cod sursa (job #2323676)
#include <bits/stdc++.h>
using namespace std;
#define plus 1000000001
#define minus 1000000002
#define ori 1000000003
#define div 1000000004
int n;
ifstream f("evaluare.in");
ofstream g("evaluare.out");
struct nod{
int val;
nod *st, *dr;
nod(){st=NULL, dr=NULL,val=0;}
} *rad;
nod * cautare(nod *&a, int x){
if( a != NULL){
if(a->val == x)return a;
if(a->val > x)return cautare(a->st,x);
if(a->val < x)return cautare(a->dr,x);
}
return a;
}
void SDR(nod *node){
if(node != NULL){
if(node->st)SDR(node->st);
if(node->dr)SDR(node->dr);
g<<node->val<<" ";
}
}
char sir[100050];
char *p;
char pr[2][3]={"+-","*/"};
nod * generare(int k){
nod *x, *y;
if(k==2){
if(*p=='('){
p++;
x=generare(0);
p++;
}
else{
x = new nod;
for(;*p>='0' && *p<='9'; p++){
x->val = x->val*10 + (*p-'0');
}
x->st=0;
x->dr=0;
}
}
else{
for(x= generare(k+1);strchr(pr[k], *p)&&(*p)!=0; x=y){
y = new nod;
switch (*p)
{
case '+':y->val=plus;break;
case '-':y->val=minus;break;
case '*':y->val=ori;break;
case '/':y->val=div;break;
}
y->st = x;
p++;
y->dr= generare(k+1);
}
}
return x;
}
int evaluare(nod*rad)
{
switch(rad->val)
{
case plus: return evaluare(rad->st)+evaluare(rad->dr);break;
case minus: return evaluare(rad->st)-evaluare(rad->dr);break;
case ori: return evaluare(rad->st)*evaluare(rad->dr);break;
case div: return evaluare(rad->st)/evaluare(rad->dr);break;
default: return rad->val;
}
}
int main()
{
f.get(sir,100050);
p=sir;
rad = generare(0);
g<<evaluare(rad);
return 0;
}