BeginPackage["stacks2`"]

stacks2::usage="Pacote que disponibiliza uma implementação de pilhas de naturais"

stackQ::usage="stackQ[e] retorna True se e denotar uma pilha"

new::usage="new denota a pilha vazia"

push::usage="push[x,p] acrescenta o elemento x ao topo da pilha p"

pop::usage="pop[p] retira o elemento do topo da pilha p"

top::usage="top[p] devolve o elemento no topo da pilha p"

Begin["`Private`"]

stackQ = Function[n, IntegerQ[n] && n > 0];

new=1;

push=Function[{x,p},
      If[IntegerQ[x]&&x>=0&&IntegerQ[p]&&p>0,
        p+2^(Floor[Log[2,p]]+x+1),
        Print["Argumento inválido (push)"]]];

pop=Function[p,
      If[IntegerQ[p]&&p>0,
        p-2^Floor[Log[2,p]],
        Print["Argumento inválido (pop)"]]];

top=Function[p,
      If[IntegerQ[p]&&p>0,
        Floor[Log[2,p]]-Floor[Log[2,pop[p]]]-1,
        Print["Argumento inválido (top)"]]];

End[]

EndPackage[]