#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");
}