Pagini recente » Cod sursa (job #2336345) | Cod sursa (job #1333782) | Cod sursa (job #2114669) | Cod sursa (job #1847528) | Cod sursa (job #1513519)
#include <fstream>
#include <iostream>
#include <cstring>
#define MAX 1000000005
using namespace std;
ifstream f("evaluare.in");
ofstream g("evaluare.out");
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;
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;
}
inline void magic(PNod &p)
{
p -> num = 0;
p -> c = 0;
}
void mache(int a, int b, PNod &p)
{
int poz = cauta(a,b);
p = new Nod;
magic(p);
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()
{
int num,vf = 0;
f >> 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);
g << eval(r);//???????????????????????????
return 0;
}