Pagini recente » Cod sursa (job #914175) | Cod sursa (job #1657123) | Cod sursa (job #2174350) | Cod sursa (job #1050043) | Cod sursa (job #1069619)
#include <fstream>
#include<string>
using namespace std;
#define MAXINT 10000000000
ifstream f("evaluare.in");
ofstream g("evaluare.out");
struct sir
{
long int val;
char operant;
}b[100000];
struct lista
{
lista*st, *dr;
long int val;
char op;
};
lista*prim = NULL;
lista*ult = NULL;
char c;
long int k, v[100000],l;
void add(long int);
void citire()
{
while (!f.eof())
{
f >> c;
if (f.eof()) break;
if (c >= '0'&&c <= '9'&&b[k].val==NULL)
{
b[k].val = c - '0';
b[k].operant = NULL;
v[k] = MAXINT;
}
else if (c >= '0'&&c <= '9'&&b[k].val != NULL)
{
b[k].val = b[k].val * 10 + c - '0';
}
else {
if(b[k].val!=NULL)k++;
b[k].operant = c;
b[k].val = NULL;
if (c == '(')
{
v[k] = 0;
l = l + 10;
}
else if (c == ')')
{
v[k] = 0;
l = l - 10;
}
else if (b[k].operant == '-' || b[k].operant == '+')v[k] = l + 1;
else v[k] = l + 2;
k++;
}
}
}
void RSD(long int st,long int dr)
{
long int x = MAXINT, i, l = -1;
for (i = st; i <= dr; i++)
if (x >= v[i] && v[i] != 0)
{
x = v[i];
l = i;
}
if (l != -1)
{
add(l);
RSD(st, l - 1);
RSD(l + 1, dr);
}
}
void add(long int x)
{
lista*q = new lista;
if (b[x].val!=NULL)q->val = b[x].val;
else q->op =b[x].operant;
if (prim == NULL)
{
q->st = NULL;
q->dr = NULL;
prim = q;
ult = q;
}
else
{
q->st = ult;
q->dr = NULL;
ult->dr = q;
ult = q;
}
}
void calcul()
{
while (ult != prim)
{
lista*p = new lista;
p = ult;
while (p->op <= 0 && p->st != NULL)p = p->st;
if (p->op == '+')
{
p->val = p->dr->val + p->dr->dr->val;
p->op = NULL;
}
else if (p->op == '*')
{
p->val = p->dr->val * p->dr->dr->val;
p->op = NULL;
}
else if (p->op == '-')
{
p->val = p->dr->val - p->dr->dr->val;
p->op = NULL;
}
else if (p->op == '/')
{
p->val = p->dr->val / p->dr->dr->val;
p->op = NULL;
}
if (p->dr->dr->dr == NULL)
{
ult = p;
p->dr = NULL;
}
else {
p->dr = p->dr->dr->dr;
p->dr->st = p;
}
}
}
int main()
{
citire();
RSD(0,k);
calcul();
g << prim->val;
return 0;
}