Pagini recente » Cod sursa (job #3160437) | Cod sursa (job #43014) | Cod sursa (job #933301) | Cod sursa (job #1944768) | Cod sursa (job #844121)
Cod sursa(job #844121)
#include<stdio.h>
#include<string.h>
using namespace std;
#define MAXL 100005
long long int st[ MAXL ];
int op[ MAXL ];
char S[ MAXL ];
int main()
{
FILE *f, *g;
f = fopen("evaluare.in", "r");
g = fopen("evaluare.out", "w");
fgets(S, 1000003, f);
int len = strlen(S) - 1;
if(S[len] == '\n')
--len;
int top = 0;
for(int i = 0; i <= len; ++i)
{
if(S[i] == '(')
{
++top, st[top] = -2000000000;
if(S[i-1] == '-')
op[top] = 2;
else if(S[i-1] == '*')
op[top] = 3;
else if(S[i-1] == '/')
op[top] = 4;
else op[top] = 1;
}
else if(S[i] >= '0' && S[i] <= '9')
{
int aux = 0, sign = 1, ii = i;
if(S[i-1] == '-')
sign = -1;
while(S[i] >= '0' && S[i] <= '9')
aux = aux * 10 + S[i] - '0', ++i;
--i;
++top, st[top] = aux * sign;
if(sign == -1)
{
op[top] = 1;
}
else if(S[ii-1] == '*')
op[top] = 3;
else if(S[ii-1] == '/')
op[top] = 4;
else op[top] = 1;
}
else if(S[i] == ')')
{
int ii = top - 1, top2, aux;
while(st[ii] != -2000000000)
--ii;
top2 = ii - 1;
aux = op[ii];
for(int j = ii + 1; j <= top; ++j)
{
if(op[j] <= 2)
++top2, st[top2] = st[j], op[top2] = op[j];
else if(op[j] == 3)
st[top2] *= st[j];
else st[top2] /= st[j];
}
op[ii] = aux;
for(int j = ii + 1; j <= top2; ++j)
if(op[j] == 1)
st[ii] += st[j];
else st[ii] -= st[j];
top = ii;
}
}
int top2 = 0;
for(int i = 1; i <= top; ++i)
if(op[i] <= 2)
++top2, st[top2] = st[i], op[top2] = op[i];
else if(op[i] == 3)
st[top2] *= st[i];
else st[top2] /= st[i];
for(int i = 2; i <= top2; ++i)
if(op[i] == 1)
st[1] += st[i];
else st[1] -= st[i];
fprintf(g, "%d\n", st[1]);
fclose(f);
fclose(g);
return 0;
}