2 KiB
2 KiB
Algo avancée - Listes
[TOC]
Problématique
Les tableaux et les listes sont des structures basiques et ne permettent pas la résolution de certains problèmes.
Les piles
Les piles sont comme une pile d'assiettes.
On dispose de fonctions permettant les opérations sur les piles :
p = creer_pile()
empiler(p, e)
depiler(p)
elt = sommet(p)
vide = pile_vide(p)
pleine = pile_pleine(p)
On peut modéliser les piles de différentes manières
Modélisation liste
On peut voir les piles comme des listes :
La tête s'appelle maintenant sommet, on empile en ajoutant un élément avant la tête, on dépile en enlevant le sommet et en le déplaçant.
La pile ici ne sera jamais pleine.
def creer_pile():
p = Pile(sommet=None)
return p
def pile_vide(p):
return p.sommet == None
def empile(p, e):
ptr = new_maillon()
ptr.suivant = p.sommet
ptr.valeur = e
p.sommet = ptr
Modélisation tableau
Renvoi au cours d'algo.
Problèmes
Bien parenthésé ?
On cherche à déterminer si une expression est bien parenthésée ou non. On va utiliser les piles pour résoudre ce problème :
def check_parentheses(expression):
pile = creer_pile()
for car in expression:
if car == '(' or car == '[':
empile(pile, car)
elif car == ')':
if pile_vide(pile) or sommet(pile) != '(':
return False
depile(pile)
elif car == ']':
if pile_vide(pile) or sommet(pile) != '[]':
return False
depile(pile)
i += 1
return pile_vide(pile)
Fonction miroir
def miroir():
pile = creer_pile()
car = input("Saisir un caractère ")
while car <= 'z' and car >= 'a' or car <= 'Z' and car >= 'A':
empile(pile, car)
car = input("Saisir un caractère ")
while not pile_vide(pile):
print(sommet(pile), end="")
depile(pile)
print()
Fonction qui sert à rien
def separate_car():
chaine = input("Saisir une chaine : ")
for car in chaine:
print(car)