
/*Programa del Funcionamiento de una Pila Dinamica

  Solo Admite un caracter, pero se puede modificar cambiando el tipo de arreglo
  por el tipo de dato que se desea y cambiar MAX para incrementar o decrementar
  el tamaño de la pila, ademas cambiar la forma de recoger el dato, lo mas comun
  por un scanf( )

  Realizado por: Durbed*/



#include <stdio.h>
#include <conio.h>
#include <stdlib.h>

#define MAX 20


int ult=0;
char pila[MAX];

void margen(void);          //Funcion del Margen

/////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////

void push_Est()
{
    if (ult>MAX)
       {
	  gotoxy(10,10);cprintf ("ERROR OVERFLOW ");
	  return;
       }
    gotoxy(10,10);cprintf("Ahora introduzca el dato: ");

    pila[ult]=getche();
    ult++;
}

/////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////


void pop_Est(void)
{

   if(ult==MAX+1)
   {
      gotoxy(10,10);cprintf ("ERROR OVERFLOW ");
   }
   else
   {

	gotoxy(10,10);cprintf("El dato eliminado sera:  %c",pila[ult-1]);
	ult--;
   }
}

/////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////

void Menu_Pila()		    //Imprime el Menu
{

gotoxy(25,8); cprintf("Funcionamianto de una PILA ESTATICA");

gotoxy(10,14);cprintf("1.     A¤adir            ( PUSH )");
gotoxy(10,18);cprintf("2.     Sacar             (  POP )");
gotoxy(10,22);cprintf("3.     Recorrer la Pila  ( Visualisar )");
gotoxy(10,26);cprintf("4.     Salir\n");
gotoxy(10,30);cprintf("Eliga una opcion: ");
}

/////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////

void main(void)
{
   int opc,z;
   char temp,dato;

   while (1)                                //Se hace un ciclo sin fin
   {
	do{
					    //Imprime el Margen
	margen();                           //Imprime el Menu
	Menu_Pila();                        //Recive la opcion tecleada
	opc =getche();


	}while (opc <'1' || opc >'4');      //Se repite amenos que opcion este
					    //entre 1 y 4, pero en su valor
					    //ASSCI correspondiente
	margen();

      switch(opc)
      {
	   case '1' :	   push_Est();	   break;

	   case '2' :	   pop_Est();	   break;

	   case '3' :

	       if(ult==0){  gotoxy(10,10);cprintf("Pila Vacia");}

	       int i=8;
		for (z=ult-1, i=8; z>=0; z--,i+=2)
		{
		    gotoxy(10,i);cprintf("º  %c  º",pila[z],z);

		   gotoxy(10,i+1);

		if(z != 0)
			cprintf("ÇÄÄÄÄÄ¶");
		else
			cprintf("ÈÍÍÍÍÍ¼");


		}
	       break;

	   case '4' :      return;	//exit(1);
      }
	gotoxy(10,45);cprintf("Pulse una tecla para continuar: ");getch();
   }
}

/////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////


void margen(void)
{

int	fil=1,	col=1;
textmode (C4350);//modo de texto 80 columnas x 50 lineas

textbackground(1);
clrscr();



textcolor(15);

	for (fil=1; fil<50; fil++)
	  {

		gotoxy(col,fil+1);   cprintf("º");
		gotoxy(col+79,fil+1);cprintf("º");

	  }
	for (col=2; col<80; col++)
	  {
		gotoxy(col,fil);     cprintf("Í");
		gotoxy(col,fil-49);  cprintf("Í");
		gotoxy(col,5);       cprintf("Í");
	  }


	gotoxy(1,1); cprintf("É");
	gotoxy(1,5); cprintf("Ì");
	gotoxy(80,5);cprintf("¹");
	gotoxy(80,1);cprintf("»");
	gotoxy(1,50);cprintf("È");


		textcolor(9);
		gotoxy(10,2);cprintf("I N S T I T U T O   P O L I T E C N I C O   N A C I O N A L ");
		textcolor(8);
		gotoxy(5,3);cprintf("ESCUELA SUPERIOR DE INGENIERIA MECANICA Y ELECTRICA - Unidad Culhuacan");
		textcolor(7);
		gotoxy(25,4);cprintf("INGENIERIA EN COMPUTACION");
textcolor(15);
}



