# -*- coding: utf-8 -*-
"""
Created on Tue Sep  9 14:40:51 2014

@author: denis.conduche
"""

""" Piles avec des listes """

def creer():
    return []

def empiler(pile,x):
    pile.append(x)
    return None
    
def depiler(pile):
    return pile.pop()


""" Piles avec des tableaux numpy : on stocke l'emplacement de la dernière case remplie dans la première case du tableau """
import numpy as np
N=3

def creer_np():
    return [np.zeros(N+1)] #tant que la première case est à 0, on peut aussi bien mettre np.empty
    
def empiler_np(L,x):
    i_max = L[0][0]
    if i_max+1 >= len(L[0]): #il ne reste plus de place dans la pile ? on double la taille
        pile=L[0]
        pile2=np.zeros(2*len(pile)) #on peut aussi bien mettre np.empty
        pile2[:i_max+1]=pile
        L[0]=pile2
    L[0][0] = i_max+1 #on augmente l'indice "dernière case remplie"
    L[0][i_max+1]=x   #on rajoute l'élement en haut de la pile
    return None
    
def depiler_np(L):
    i_max = L[0][0]
    if i_max == 0:
        raise IndexError('dépilage d\'une pile vide')
    else:
        x = L[0][i_max]
        L[0][0] = i_max -1        
    return x


"""" Tests :"""

c=creer()
empiler(c,3)
print('affiche c')
print(c)
print('affiche depiler c : '+str(depiler(c)))
#print('affiche depiler c : '+str(depiler(c))) # <--tester les cas qui déclenchent des erreurs !
 # on peut faire une erreur plus propre.

""" Tests avec tableaux numpy"""
c=creer_np()
#depiler_np(c) # <--tester les cas qui déclenchent des erreurs !
for i in range(2*N):
    empiler_np(c,i)
    print(i, " : ", c)
print(depiler_np(c))  