/* Simple calculator by Dimitris Papastamos * 2007 - 2008 * v. 0.1 BETA */ #include #include struct stack { int *head; int pointer; int limit; } *obj; int push(int); int pop(); int peek(int, char *); int isEmpty(); void init(int); void printStack(); int evaluatePostfixExpression(char *); void clearup(); int main(void) { printf("Enter expression to evaluate : "); char *array = (char *)malloc(256 * sizeof(char)); if(fgets(array, 256, stdin) != NULL) ; init(256); int result = evaluatePostfixExpression(array); if(result < 0) { fprintf(stderr, "\nillegal expression, exiting...\a\n"); } else { printf("\nThe result is %d\n", result); } printf("Programmed by Dimitris Papastamos\n"); clearup(); return 0; } void init(int capacity) { obj = (struct stack *)malloc(sizeof(struct stack)); obj->head = (int *)malloc(capacity * sizeof(int)); obj->pointer = -1; obj->limit = capacity; } int evaluatePostfixExpression(char *array) { int x,y; int result; char *num = (char *)malloc(9 * sizeof(char)); int i = 0, pointer = 0, index = 0; array[strlen(array) - 1] = '\0'; while(array[pointer] != '\0') { index = 0; if(isdigit(array[pointer])) { i = pointer; num[index] = array[pointer]; while(peek(i, array) > 0) { num[++index] = array[++pointer]; i++; } num[++index] = '\0'; push(atoi(num)); } else if(isspace(array[pointer])) { pointer++; continue; } else { x = pop(); y = pop(); switch(array[pointer]) { case '+': result = x + y; break; case '-': result = y - x; break; case '*': result = x * y; break; case '/': if ( x != 0 ) result = y / x; else printf("error : division by zero !\a\n"); break; default : printf("error: broken expression !\a\n"); return -1; } push(result); } pointer++; } return pop(); } int push(int ch) { if(obj->pointer + 1 < obj->limit) { obj->pointer++; obj->head[obj->pointer] = ch; } else { return -1; } return 0; } int isEmpty() { return (obj->pointer == -1); } int pop() { if(isEmpty()) return -1; return obj->head[obj->pointer--]; } void printStack() { int i; for(i = 0; i < obj->pointer + 1; i++) printf("stack[%d] = %d\n", i, obj->head[i]); } int peek(int i, char *array) { if(isdigit(array[i+1])) { return 1; } else if (isspace(array[i+1])) { return 0; } return -1; } void clearup() { free(obj->head); free(obj); }