Pagini recente » Cod sursa (job #1857413) | Cod sursa (job #3243906) | Cod sursa (job #1716) | Cod sursa (job #274956) | Cod sursa (job #2788170)
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#define LENMAX 100000
char expr[LENMAX];
int len, i;
char oper[LENMAX], nr[LENMAX];
int lenOper, lenNr;
static inline int factor(){
int retval = 0;
while(isdigit(expr[i]))
retval = retval * 10 + expr[i++] - '0';
return retval;
};
static inline void pushNr(int number){
nr[lenNr++] = number;
};
static inline int popNr(){
return lenNr ? nr[--lenNr] : 0;
};
static inline void pushOper(char operatie){
if (operatie == '*' || operatie == '/' || operatie == '+' || operatie == '-' || operatie == '(' || operatie == ')')
oper[lenOper++] = operatie;
};
static inline char topOper(){
return lenOper ? oper[lenOper - 1] : '\0';
};
static inline char popOper(){
return lenOper ? oper[--lenOper] : '\0';
};
static inline int prio(char operatie){
int retval = 0;
if(operatie == '*' || operatie == '/')
retval = 2;
else if(operatie == '+' || operatie == '-')
retval = 1;
return retval;
};
static inline int comp(int a, int b, char operatie){
int retval = 0;
switch(operatie) {
case '*':
retval = a * b;
break;
case '/':
retval = a / b;
break;
case '+':
retval = a + b;
break;
case '-':
retval = a - b;
break;
}
/*if(operatie == '\0')
printf("estiprost");
fputc(operatie, stdout);
fputc('\n', stdout);*/
return retval;
};
static inline void compTop(){
int a, b;
b = popNr();
a = popNr();
pushNr(comp(a, b, popOper()));
};
int main() {
FILE *fin, *fout;
fin = fopen("evaluare.in", "r");
fgets(expr, LENMAX, fin);
len = strlen(expr);
fclose(fin);
lenNr = lenOper = i = 0;
while(i < len) {
if(expr[i] >= '0' && expr[i] <= '9')
pushNr(factor());
else if(expr[i] == '(')
pushOper(expr[i++]);
else if(expr[i] == ')') {
while(topOper() != '(')
compTop();
popOper();
i++;
} else if(prio(expr[i])) {
while(prio(topOper()) && prio(topOper()) >= prio(expr[i]))
compTop();
pushOper(expr[i++]);
} else
i++;
//printf("1");
}
while(lenOper)
compTop();
fout = fopen("evaluare.out", "w");
fprintf(fout, "%d", popNr());
fclose(fout);
return 0;
}