Pagini recente » Cod sursa (job #2663104) | Cod sursa (job #1349738) | Cod sursa (job #1973641) | Cod sursa (job #84123) | Cod sursa (job #2788190)
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#define LENMAX 100000
char expr[LENMAX];
int len, i;
char oper[LENMAX];
int nr[LENMAX];
int lenOper, lenNr;
static inline int factor(){
int retval = 0;
while(expr[i] >= '0' && expr[i] <= '9')
retval = retval * 10 + expr[i++] - '0';
return retval;
};
static inline void pushNr(int number) {
nr[lenNr++] = number;
//printf("number = %d lenNr = %d nr[lenNr - 1] = %d \n", number, lenNr, nr[lenNr - 1]);
};
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;
default:
break;
}
/*if(operatie == '\0')
printf("estiprost"); */
//printf("%d %d %c %d\n", a, b, operatie, retval);
return retval;
};
static inline void compTop() {
int a, b, x;
b = popNr();
a = popNr();
x = comp(a, b, popOper());
pushNr(x);
//printf("x = %d nr[0] = %d \n", x, nr[0]);
//for(int i = 0; i < lenNr; i++)
//printf("%d\n", nr[i]);
};
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;
}