Cod sursa(job #473935)
#include <stdio.h>
#include <string.h>
using namespace std;
char sir[100001], stack[1001], output[10001];
int stiva[101];
int prior[101];
int n, i, j, k;
int nr;
int primul, varf;
void initializare ()
{
prior['('] = prior[')'] = 4;
prior['+'] = prior['-'] = 1;
prior['*'] = prior['/'] = 2;
}
int este_semn (char x)
{
if (x == '+' || x == '-' || x == '*' || x == '/' || x == '(' || x == ')')
return 1;
return 0;
}
int conversie_semn (char x)
{
if (x == '+')
return -1;
if (x == '-')
return -2;
if (x == '*')
return -3;
if (x == '/')
return -4;
}
int main ()
{
FILE *f = fopen ("evaluare.in","r");
FILE *g = fopen ("evaluare.out","w");
fscanf (f,"%s", sir);
//printf (sir);
initializare ();
i = 0;
while (sir[i] != '\0')
{
if (sir[i] >= '0' && sir[i] <= '9')
{
while (sir[i] >= '0' && sir[i] <= '9')
{
nr = nr * 10 + sir[i] - '0';
i ++;
}
i --;
n ++;
primul ++;
output[primul] = nr + '0';
nr = 0;
}
else if (sir[i] == '(')
{
varf ++;
stack[varf] = '(';
}
else if (sir[i] == ')')
{
varf;
while (stack[varf] != '(')
{
if (stack[varf] != '(' && stack[varf] != ')')
{
primul ++;
output[primul] = stack[varf];
}
stack[varf] = 0;
varf --;
}
stack[varf] = 0;
varf --;
}
else if (este_semn (sir[i]))
{
if (prior[sir[i]] <= prior[stack[varf]] && stack[varf] != '(' && stack[varf] != ')')
{
primul ++;
output[primul] = stack[varf];
stack[varf] = sir[i];
}
else
{
varf ++;
stack[varf] = sir[i];
}
}
i ++;
}
while (varf)
{
primul ++;
output[primul] = stack[varf];
varf --;
}
/*for (i=1; i<=primul; ++i)
printf ("%c ", output[i]);*/
i = 2;
varf = 1;
stiva[varf] = output[1] - '0';
while (i <= primul)
{
if (este_semn (output[i]) )
{
if (output[i] == '+')
{
stiva[varf-1] += stiva[varf];
stiva[varf] = 0;
varf --;
}
else if (output[i] == '-')
{
stiva[varf-1] -= stiva[varf];
stiva[varf] = 0;
varf --;
}
else if (output[i] == '*')
{
stiva[varf-1] *= stiva[varf];
stiva[varf] = 0;
varf --;
}
else if (output[i] == '/')
{
stiva[varf-1] /= stiva[varf];
stiva[varf] = 0;
varf --;
}
}
else
{
varf ++;
stiva[varf] = output[i] - '0';
}
i ++;
}
fprintf (g, "%d", stiva[1]);
fclose (g);
fclose (f);
return 0;
}