rendered paste body/* Simple calculator by Dimitris Papastamos
* 2007 - 2008
* v. 0.1 BETA
*/
#include <stdio.h>
#include <ctype.h>
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);
}