All pastes #329751 Raw Edit

Untitled

public text v1 · immutable
#329751 ·published 2007-01-27 00:49 UTC
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);

}