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

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)