Md-IUT-Cours/algo_avancee/piles.md
2015-01-28 09:34:38 +01:00

91 lines
2 KiB
Markdown

# 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 :
```python
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.
```python
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 :
```python
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
```python
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
```python
def separate_car():
chaine = input("Saisir une chaine : ")
for car in chaine:
print(car)
```