#include "pilhasm.h"
struct PilhaMStr
{
size_t tamanho, topo;
void **m;
};
PilhaM *PMcria(size_t tamanho)
{
PilhaM *p;
if((p = malloc(sizeof(*p))) == 0)
return 0;
if(tamanho == 0)
p->tamanho = PMTAMANHO;
else
p->tamanho = tamanho;
if((p->m = calloc(p->tamanho, sizeof(void *))) == 0)
{
free(p);
return 0;
}
p->topo = 0;
return p;
}
void PMdestroi(PilhaM *p)
{
if(p == 0)
return;
free(p->m);
free(p);
}
PilhaM *PMesvazia(PilhaM *p)
{
if(p != 0)
p->topo = 0;
return p;
}
size_t PMquantos(PilhaM *p)
{
if(p == 0)
return 0;
return p->topo;
}
int PMcheia(PilhaM *p)
{
if(p == 0)
return 0;
return p->topo == p->tamanho;
}
PilhaM *PMpoe(PilhaM *p, void *d)
{
if(p == 0 || p->topo == p->tamanho)
return 0;
p->m[p->topo++] = d;
return p;
}
void *PMtira(PilhaM *p)
{
if(p == 0 || p->topo == 0)
return 0;
return p->m[--(p->topo)];
}
#ifdef TESTE
#include <stdio.h>
int main(void)
{
PilhaM *p;
int val, *pval;
p = PMcria(7);
do
{
printf("Valor a inserir (0 para sair, negativo para retirar): ");
if(scanf("%d", &val) != 1)
return EXIT_FAILURE;
if(val < 0)
{
printf("Retirando: ");
if((pval = PMtira(p)) == 0)
puts("pilha vazia!");
else
{
printf("Retirei %d.\n", *pval);
free(pval);
}
}
else if(val > 0)
{
printf("Inserindo: ");
if((pval = malloc(sizeof(int))) == 0)
return EXIT_FAILURE;
*pval = val;
if(PMpoe(p, pval) == 0)
puts("pilha cheia!");
else
printf("Inseri %d.\n", val);
}
}
while(val != 0);
if(PMcheia(p))
puts("Esta' cheia!");
if(PMquantos(p) != 0)
{
printf("Retirando:");
while((pval = PMtira(p)) != 0)
{
printf(" %d", *pval);
free(pval);
}
putchar('\n');
}
PMdestroi(p);
return EXIT_SUCCESS;
}
#endif