#include <stdio.h>
typedef enum {FALSE, TRUE} bool;
/* DECLARATION OF STACK ELEMENTS AND OF STACK STRUCTURE */
typedef char stackElt;
typedef struct stackNode* stackNodePtr;
typedef struct stackNode {
stackElt elt;
stackNodePtr link;
} stackNode;
stackNodePtr newStackNode(stackElt e); // auxiliary function
stackNodePtr newStackNode(stackElt e) {
stackNodePtr p = (stackNodePtr)malloc(sizeof(stackNode));
p->elt = e;
p->link = NULL;
return(p);
}
typedef struct stackHeader {
stackNodePtr top;
int size;
} stackHeader;
typedef stackHeader* stack;
/* FUNCTION PROTOTYPES AND DOCUMENTATION (file stack.h) */
stack createStack(); // create a new empty stack
bool isEmptyStack(stack s); // check whether stack s is empty or not
bool isFullStack (stack s); // check whether stack s is full or not
int sizeOfStack (stack s);
stack push(stackElt e, stack s); // add element e on top of non-full stack s
stack pop(stack s); // remove top element of non-empty stack s
stackElt top(stack s); // get top element of non-empty stack s
void showStack(stack s); // print the contents of stack s
/* DEFINITION OF THE FUNCTIONS (file stack.c) */
stack createStack() {
stack s = (stack)malloc(sizeof(stackHeader));
s->top = NULL;
s->size = 0;
return(s);
}
bool isEmptyStack(stack s) {return(s->size == 0);}
bool isFullStack (stack s) {return(FALSE);}
int sizeOfStack (stack s) {return(s->size);}
stack push(stackElt e, stack s) {
stackNodePtr p = newStackNode(e);
p->link = s->top;
s->top = p;
s->size++;
return(s);
}
stack pop(stack s) { // s is not empty
stackNodePtr p = s->top;
s->top = s->top->link;
free(p);
s->size--;
return(s);
}
stackElt top(stack s) { // s is not empty
return(s->top->elt);
}
void showStack(stack s) {
stackNodePtr p = s->top;
while (p) {
printf("%2c", p->elt);
p = p->link;
}
printf("\n");
}