/* File: pileseq.c */
/* Time-stamp: "2002-05-17 00:24:57 calvanes" */
/* Scopo: rappresentazione sequenziale delle pile tramite array statico */

/* Richiede di dichiarare il tipo bool */
/* typedef int bool; */

/* Richiede di dichiarare la dimensione massima della pila */
/* #define MaxPila 10 */

/* Richiede di dichiarare il tipo degli elementi della pila */
/* typedef int TipoElemPila; */


/* definizione del tipo pila */

struct tipoPila {
  TipoElemPila pila[MaxPila];
  int pos;
};
typedef struct tipoPila TipoPila;


/* implementazione delle operazioni primitive sulle pile */

void InitPila(TipoPila *pp)
  /* Inizializza la pila *pp ponendo a -1 l'indice dell'elemento affiorante
     della pila. */
{
  (*pp).pos = -1;
}  /* InitPila */


bool TestPilaVuota(TipoPila p)
  /* Restituisce TRUE se la pila p e` vuota, FALSE altrimenti. */
{
  return (p.pos == -1);
}  /* TestPilaVuota */


void TopPila(TipoPila p, TipoElemPila *pv)
  /* Restituisce in *pv l'elemento affiorante della pila p,
     senza modificare la pila. */
{
  if (TestPilaVuota(p))
    printf("ERRORE: PILA VUOTA\n");
  else
    *pv = p.pila[p.pos];
}  /* TopPila */


bool TestPilaPiena(TipoPila p)
  /* Restituisce TRUE se la pila p e` piena, FALSE altrimenti. */
{
  return (p.pos == (MaxPila - 1));
}  /* TestPilaPiena */


void Push(TipoPila *pp, TipoElemPila v)
  /* Inserisce l'elemento v in cima alla pila *pp. */
{
  if (TestPilaPiena(*pp))
    printf("ERRORE: PILA PIENA\n");
  else {
    (*pp).pos++;
    (*pp).pila[(*pp).pos] = v;
  }
}  /* Push */


void Pop(TipoPila *pp, TipoElemPila *pv)
  /* Elimina l'elemento affiorante della pila *pp, restituendone il valore
     in *pv.
   */
{
  if (TestPilaVuota(*pp))
    printf("ERRORE: PILA VUOTA\n");
  else {
    *pv = (*pp).pila[(*pp).pos];
    (*pp).pos--;
  }
}  /* Pop */