Pagini recente » Cod sursa (job #1412032) | Cod sursa (job #1107062) | Cod sursa (job #2945127) | Cod sursa (job #908808) | Cod sursa (job #323098)
Cod sursa(job #323098)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define SMAX 100000
int isDigit(char c)
{
return c >= '0' && c <= '9';
}
typedef struct{
int nr;
char op;
} EL;
int Prior(char a, char b)
{
if(b == '*' || b == '/')
return 1;
if(a == '*' || a == '/')
return 0;
if(b == '+' || b == '-')
return 1;
if(a == '+' || a == '-')
return 0;
return 0;
}
int OP(int a, int b, char c)
{
switch(c){
case '*':
return a * b;
case '/':
return a / b;
case '+':
return a + b;
case '-':
return a - b;
}
return 0;
}
int main()
{
freopen("evaluare.in", "r", stdin);
freopen("evaluare.out", "w", stdout);
char buff[SMAX], op;
EL P[SMAX], S[SMAX];
int n, vf = n = 0;
int i, nr;
fgets(buff, SMAX, stdin);
//cat timp exista caractere
for(i=0; buff[i] && buff[i] != '\n'; ++i){
if(isDigit(buff[i])){
nr = (int)(buff[i] - '0');
while(isDigit(buff[++i]))
nr = nr * 10 + (int)(buff[i] - '0');
//printf("nr:%d\n", nr);
P[n].nr = nr;
P[n++].op = 0;
if(!buff[i] || buff[i] == '\n')
break;
}
op = buff[i];
if(op == '(')
S[vf++].op = op;
else if(op == ')'){
while(vf > 0 && S[vf-1].op != '(')
P[n++] = S[--vf];
--vf;
}
else{
while(vf > 0 && Prior(S[vf-1].op, op))
P[n++] = S[--vf];
S[vf++].op = op;
}
}
while(vf > 0)
P[n++] = S[--vf];
while(n){
if(!P[n-1].op)
S[vf++] = P[n-1];
else
S[vf-3].nr = OP(S[vf-1].nr, S[vf-2].nr, S[vf-3].op);
S[vf-3].op = 0;
vf -= 2;
}
printf("%d\n", S[0].nr);
return 0;
}