Signaler

Problème de compréhension avec les piles [Résolu]

Posez votre question futura2015 30Messages postés lundi 2 août 2010Date d'inscription 13 mai 2017 Dernière intervention - Dernière réponse le 10 mai 2017 à 14:50 par futura2015
Bonjour,

Je n'arrive pas à comprendre un exemple sur les piles.

MyStack = []
StackSize = 3

def DisplayStack():
   print("État courant de la pile :")
   for Item in MyStack:
      print(Item)
   
def Push(Value):
   if len(MyStack) < StackSize:
      MyStack.append(Value)
   else:
      print("La pile est pleine !")

def Pop():
   if len(MyStack) > 0:
      MyStack.pop()
   else:
      print("La pile est vide.")

Push(1)
Push(2)
Push(3)
DisplayStack()
input("Appuyez sur une touche quand vous êtes prêt...")

Push(4)
DisplayStack()
input("Appuyez sur une touche quand vous êtes prêt...")

Pop()
DisplayStack()
input("Appuyez sur une touche quand vous êtes prêt...")

Pop()
Pop()
Pop()
DisplayStack()


Quelqu'un saurait m'expliquer comment on peut retirer de la même manière les élément un par un jusqu'a ce qu'il n'en reste que deux (donc comme dans l'exemple ci-dessus) mais en augmenter la taille limite à 4 ou à 5 ou à 6 ect... ?

J'espère que je me suis bien exprimée.

Merci d'avance

Afficher la suite 
Utile
+0
plus moins
Bonjour,

La fonction pop retire le dernier élément de la pile.

Pour retirer les éléments un par un jusqu'à ce qu'il n'en reste que deux, tu dois faire une boucle :
tant que la taille de ta pile est strictement supérieure à 2, tu enlèves un élément

Enfin la taille maximum de la pile est définie dans ton exemple par "StackSize" donc si tu veux que ta pile puisse contenir 5 éléments, tu dois mettre cette valeur à 5 :-)
Donnez votre avis
Utile
+0
plus moins
Bonjour Arya,

Merci pour ta réponse, par contre je ne vois pas ce que ça donne en code tu peux me montrer ?
Donnez votre avis
Utile
+0
plus moins
Pour augmenter la taille de la pile (en gardant 5 comme exemple) :
StackSize = 5


Pour retirer les éléments sauf 2 :

def RetirerElements () :
if len(MyStack) < 3 : #on verifie que la pile contient assez d'elements, au moins 3
print ("la pile ne contient pas assez d'elements")
else :
while len (MyStack) > 2 :
MyStack.pop()
Donnez votre avis
Utile
+0
plus moins
J'ai essayé d'insérer le code que tu m'as donné mais ça n'a pas marché.
Donnez votre avis
Utile
+0
plus moins
Essaye comme ça moi ça fonctionne

MyStack = []
StackSize = 5

def DisplayStack():
   print("État courant de la pile :")
   for Item in MyStack:
      print(Item)
   
def Push(Value):
   if len(MyStack) < StackSize:
      MyStack.append(Value)
   else:
      print("La pile est pleine !")

def Pop():
   if len(MyStack) > 0:
      MyStack.pop()
   else:
      print("La pile est vide.")

def RetirerElements () : 
  if len(MyStack) < 3 : 
    print ("la pile ne contient pas assez d'elements")
  else : 
    while len (MyStack) > 2 :
      MyStack.pop()

Push(1)
Push(2)
DisplayStack()
RetirerElements ()

Push(3)
Push(4)
DisplayStack()


RetirerElements ()
DisplayStack()
Donnez votre avis
Utile
+0
plus moins
Non et puis du coup ca ne marche plus en tapant une touche

État courant de la pile :
1
2
la pile ne contient pas assez d'elements
État courant de la pile :
1
2
3
4
État courant de la pile :
1
2
>>>
Donnez votre avis
Utile
+0
plus moins
ah il faut rajouter les input :

MyStack = []
StackSize = 5

def DisplayStack():
   print("État courant de la pile :")
   for Item in MyStack:
      print(Item)
   
def Push(Value):
   if len(MyStack) < StackSize:
      MyStack.append(Value)
   else:
      print("La pile est pleine !")

def Pop():
   if len(MyStack) > 0:
      MyStack.pop()
   else:
      print("La pile est vide.")

def RetirerElements () : 
  if len(MyStack) < 3 : 
    print ("la pile ne contient pas assez d'elements")
  else : 
    while len (MyStack) > 2 :
      MyStack.pop()

Push(1)
Push(2)
DisplayStack()
input("Appuyez sur une touche quand vous êtes prêt...")

RetirerElements ()
input("Appuyez sur une touche quand vous êtes prêt...")
Push(3)
Push(4)
DisplayStack()
input("Appuyez sur une touche quand vous êtes prêt...")
RetirerElements ()
DisplayStack()
Donnez votre avis
Utile
+0
plus moins
Non ça ne marche pas comme le 1er.
Donnez votre avis
Utile
+0
plus moins
Explique exactement ce que tu veux alors parce que je dois pas avoir tout compris....

Le programme retire tous les éléments de la pile sauf 2 et ce quel que soit la taille de la pile
Donnez votre avis
Utile
+0
plus moins
Alors je vais essayer d'être plus clair.

L'exemple d'origine c'est

MyStack = []
StackSize = 3

def DisplayStack():
print("État courant de la pile :")
for Item in MyStack:
print(Item)

def Push(Value):
if len(MyStack) < StackSize:
MyStack.append(Value)
else:
print("La pile est pleine !")

def Pop():
if len(MyStack) > 0:
MyStack.pop()
else:
print("La pile est vide.")

Push(1)
Push(2)
Push(3)
DisplayStack()
input("Appuyez sur une touche quand vous êtes prêt...")

Push(4)
DisplayStack()
input("Appuyez sur une touche quand vous êtes prêt...")

Pop()
DisplayStack()
input("Appuyez sur une touche quand vous êtes prêt...")

Pop()
Pop()
Pop()
DisplayStack()


qui donne ça



État courant de la pile :
1
2
3
Appuyez sur une touche quand vous êtes prêt...
La pile est pleine !
État courant de la pile :
1
2
3
Appuyez sur une touche quand vous êtes prêt...
État courant de la pile :
1
2
Appuyez sur une touche quand vous êtes prêt...
La pile est vide.
État courant de la pile :
>>>

Je souhaiterais qu'en augmentant la taille de la pile, le programme se termine de la même façon,

soit

Appuyez sur une touche quand vous êtes prêt...
État courant de la pile :
1
2
Appuyez sur une touche quand vous êtes prêt...
La pile est vide.
État courant de la pile :
>>>

quelle que soit la taille de la pile.

Hors je n'ai pas réussi à obtenir ce résultat. J'ai augmenté la taille, ajouté des valeurs, modifié le nombre de pop() de la fin, rien n'y fait. Je n'arrive pas à obtenir (exemple avec 4)

État courant de la pile :
1
2
3
4
Appuyez sur une touche quand vous êtes prêt...
La pile est pleine !
État courant de la pile :
1
2
3
4
Appuyez sur une touche quand vous êtes prêt...
État courant de la pile :
1
2
3
Appuyez sur une touche quand vous êtes prêt...
État courant de la pile :
1
2
Appuyez sur une touche quand vous êtes prêt...
La pile est vide.
État courant de la pile :
>>>


Une idée ?
Donnez votre avis
Utile
+0
plus moins
J'ai mieux compris je crois... Et comme ça ?

MyStack = []
StackSize = 5

def DisplayStack():
   print("État courant de la pile :")
   for Item in MyStack:
      print(Item)
   
def Push(Value):
   if len(MyStack) < StackSize:
      MyStack.append(Value)
   else:
      print("La pile est pleine !")

def Pop():
   if len(MyStack) > 0:
      MyStack.pop()
   else:
      print("La pile est vide.")

def RetirerElements () : 
  while len (MyStack) > 2 :
   MyStack.pop()
   DisplayStack()
   input("Appuyez sur une touche quand vous êtes prêt...")
  Pop()
  Pop()
  Pop()
  DisplayStack()

for i in range (1,StackSize+1) : 
 Push(i)

DisplayStack()
input("Appuyez sur une touche quand vous êtes prêt...")

Push(StackSize+1)
DisplayStack()
input("Appuyez sur une touche quand vous êtes prêt...")

RetirerElements ()
input("Appuyez sur une touche quand vous êtes prêt...")
Push(3)
Push(4)
DisplayStack()
input("Appuyez sur une touche quand vous êtes prêt...")
RetirerElements ()
DisplayStack()
Donnez votre avis
Utile
+0
plus moins
Une autre version.

class Fifo(list) :
    
    def __init__(self, tmin, tmax, *elements) :
        self._tmax = tmax
        self._tmin = tmin
        super().__init__(elements)
        self._compteur = super().__len__()
        if not tmin <= self._compteur <= tmax :
            raise ValueError("nombre éléments ({}) non compris entre {} et {}".format(self._compteur, tmin, tmax)) 
 
    def __str__(self) :
        return super().__str__().replace('\'', '').replace('"', '').strip('[]')
        
    def append(self, value) :
        if self._compteur + 1 > self._tmax :
            raise RuntimeError("Ne peut ajouter d'élément, la pile est pleine")
        super().append(value)
        self._compteur += 1
        
    def pop(self) :
        if self._compteur - 1 < self._tmin :
            raise RuntimeError("Ne peut supprimer d'élément, la pile est trop basse")
        self._compteur -= 1
        super().pop(0)
        
    @property
    def compteur(self) :
        return self._compteur

pile = Fifo(0, 4, 'a', 'b', 'c', 'd')

print('Première pile')
i = 0
while pile.compteur :
    if i :
        input('Appuyez sur entrée quand vous êtes prêt...')
    print('État courant de la pile :')
    print(pile)
    pile.pop()
    i += 1
print('La première pile est vide')
    

print('Seconde pile')
pile = Fifo(0, 6)
for i in range(1, 7) :
    pile.append(i)
i = 0
while pile.compteur :
    if i :
        input('Appuyez sur entrée quand vous êtes prêt...')
    print('État courant de la pile :')
    print(pile)
    pile.pop()
    i += 1
print('la seconde pile est vide')
Donnez votre avis
Utile
+0
plus moins
Merci j'ai eu la réponse ! :)

c'est :

MyStack = []
StackSize = 4

def DisplayStack():
print("État courant de la pile :")
for Item in MyStack:
print(Item)

def Push(Value):
if len(MyStack) < StackSize:
MyStack.append(Value)
else:
print("La pile est pleine !")

def Pop():
if len(MyStack) > 0:
MyStack.pop()
else:
print("La pile est vide.")

Push(1)
Push(2)
Push(3)
Push(4)
DisplayStack()
input("Appuyez sur une touche quand vous êtes prêt...")

Push(5)
Push(6)
DisplayStack()
input("Appuyez sur une touche quand vous êtes prêt...")

Pop()
DisplayStack()
input("Appuyez sur une touche quand vous êtes prêt...")

Pop()
DisplayStack()

Pop()
Pop()
Pop()
DisplayStack()


Il faut rajouter des Pop() dans le code moi je pensais que c'était à la fin alors qu'effectivement c'est logique que ce soit comme ça.
Donnez votre avis

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes.

Le fait d'être membre vous permet d'avoir des options supplémentaires.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !