/****************************************************************************
PROGRAMA:	Stack
AUTOR:		Kiko
FECHA:		20.09.94
FINALIDAD:	Implementaci¢n de una pila en C
				Se implementan las operaciones habituales: inicializaci¢n, push,
				pop, test de si est  vac¡a, extracci¢n del top.
				Se implementa usando memoria est tica.
HISTORIA:
BIBLIOGRAFIA:	Data Structures in C
					A. M. Tenenbaum
					Ed. Prentice-Hall
					pg. 74 y sigs.
MODO DE UTILIZACION: stack
****************************************************************************/
#include <stdlib.h>
#include <stdio.h>

#define STACKSIZE	100		/* N£mero m ximo de elementos en la pila */

typedef int element_type;	/* TIPO de los elementos de la pila */

typedef enum {FALSE = 0, TRUE = 1} boolean;

struct stack {
	int top;
	element_type items[STACKSIZE];
};

/*********************** PROTOTIPOS DE FUNCIONES ****************************/
	boolean empty(struct stack *ps);
	void init_stack(struct stack *ps);
	element_type pop(struct stack *ps);
	void push(struct stack *ps, element_type x);
	element_type stack_top(struct stack *ps);

struct stack s;

/****************************************************************************
* empty -- Indica si la pila est  vac¡a o no
*
* Par metros:
*		*ps: puntero a la pila
* Devuelve:
*		TRUE si est  vac¡a FALSE si no lo est 
****************************************************************************/
boolean empty(struct stack *ps)
{
	return((boolean)(ps->top == -1));
}
/****************************************************************************
* init_stack -- Inicializa la pila
*
* Par metros:
*		*ps: puntero a la pila
****************************************************************************/
void init_stack(struct stack *ps)
{
	ps->top = -1;
}
/****************************************************************************
* pop -- Extrae el elemento del top de la pila si no est  vac¡a
*
* Par metros:
*		*ps: puntero a la pila
* Devuelve:
*		El elemento del top de la pila si no est  vac¡a
****************************************************************************/
element_type pop(struct stack *ps)
{
	if (empty(ps)) {
		printf("Error: Stack Underflow.\n");
		exit(1);
	}
	return(ps->items[ps->top--]);
}
/****************************************************************************
* push -- Coloca un valor en la pila
*
* Par metros:
*		*ps: puntero a la pila
*		x: valor a colocar en la pila
****************************************************************************/
void push(struct stack *ps, element_type x)
{
	if (ps->top == STACKSIZE -1) {
		printf("Error: Stack Overflow.\n");
		exit(1);
	}
	else
		ps->items[++(ps->top)] = x;
}
/****************************************************************************
* stack_top -- Devuelve sin quitarlo de la pila el elemento que est  en el
*					top de la misma, si no est  vac¡a
*
* Par metros:
*		*ps: puntero a la pila
* Devuelve:
*		El elemento del top de la pila si no est  vac¡a
****************************************************************************/
element_type stack_top(struct stack *ps)
{
	if (empty(ps)) {
		printf("Error: Stack Underflow.\n");
		exit(1);
	}
	return(ps->items[ps->top]);
}
/****************************************************************************/
void main()
{
	int i, x;

	(void)system("cls");
	init_stack(&s);

	if (empty(&s))
		printf("Pila vac¡a.\n");
	else
		printf("Pila no vac¡a.\n");

	for (i = 0; i <= 5; i++)
		push(&s, i);

	if (empty(&s))
		printf("Pila vac¡a.\n");
	else
		printf("Pila no vac¡a.\n");

	for (i = 0; i <= 6; i++) {
		x = pop(&s);
		printf("Elemento extra¡do: %d\n", x);
		}

	exit(0);
}

