/*------------------------------------------------------------------*/ /* stackarraybad.c */ /* Author: Bob Dondero */ /* A Stack ADT implementation as an array that does not define the */ /* data structure */ /*------------------------------------------------------------------*/ #include "stackbad.h" #include #include enum {INITIAL_PHYS_LENGTH = 2}; enum {GROWTH_FACTOR = 2}; /*------------------------------------------------------------------*/ struct Stack *Stack_new(void) /* Return the address of a new Stack. */ { struct Stack *psStack; psStack = (struct Stack*)malloc(sizeof(struct Stack)); assert(psStack != NULL); psStack->pdArray = (double*)calloc(INITIAL_PHYS_LENGTH, sizeof(double)); assert(psStack->pdArray != NULL); psStack->iTop = 0; psStack->iPhysLength = INITIAL_PHYS_LENGTH; return psStack; } /*------------------------------------------------------------------*/ void Stack_free(struct Stack *psStack) /* Free psStack. */ { if (psStack == NULL) return; free(psStack->pdArray); free(psStack); } /*------------------------------------------------------------------*/ static void Stack_grow(struct Stack *psStack) /* Double the physical length of *psStack. */ { assert(psStack != NULL); psStack->iPhysLength *= GROWTH_FACTOR; psStack->pdArray = (double*)realloc(psStack->pdArray, sizeof(double) * psStack->iPhysLength); assert(psStack->pdArray != NULL); } /*------------------------------------------------------------------*/ void Stack_push(struct Stack *psStack, double dItem) /* Push dItem onto *psStack. It is a checked runtime error for psStack to be NULL. */ { assert(psStack != NULL); if (psStack->iTop == psStack->iPhysLength) Stack_grow(psStack); (psStack->pdArray)[psStack->iTop] = dItem; (psStack->iTop)++; } /*------------------------------------------------------------------*/ double Stack_pop(struct Stack *psStack) /* Pop *psStack, and return the popped item. It is a checked runtime error for psStack to be NULL or for *psStack to be empty. */ { assert(psStack != NULL); assert(psStack->iTop > 0); (psStack->iTop)--; return (psStack->pdArray)[psStack->iTop]; } /*------------------------------------------------------------------*/ int Stack_isEmpty(struct Stack * psStack) /* Return 1 (TRUE) iff *psStack is empty. It is a checked runtime error for psStack to be NULL. */ { assert(psStack != NULL); return psStack->iTop == 0; }