Programmation .Net - Indépendance financière

Comment utiliser la Stack/Pile en Visual Basic/C#

La Pile (Stack) ressemble beaucoup aux trois dernières collections que nous avons vues (List, Dictionary, File (Queue)). La différence est toutefois dans sa structure que l’on peut facilement comparer à un réchaud à assiettes dans un restaurant. Suivant cet exemple, la première assiette qui sera mise par le serveur dans le réchaud sera la dernière prise par le client pour se servir. Donc on parlera d’un concept First in, Last out soit premier entré, dernier sorti. Voici une image pour tenter mieux illustrer :

First In, Last Out

Les formes grises représentent les assiettes alors que es deux rectangles orange et bleu représentent plutôt les bordures du réchaud. Comme vous pouvez le constater, lorsque vous pousser une assiette dans le réchaud, elle sera la première à sortir si un client la prend immédiatement, toutefois, plus vous en poussez, plus l’assiette se rend loin et prendra du temps à resortir. C’est le contraire de la Queue en quelque sorte. Un exemple réel d’utilisation (je veux dire en code) pourrait être les tags html qui s’imbriquent les uns dans les autres, un peu comme des poupées russes. Par exemple:

html – head – title et ensuite pour fermer /title – /head – /html donc dans le sens contraire.

Simplement pour vous montrer qu’il existe effectivement des cas où cette structure peut être utile.

Déclaration

Voici comment déclarer une Stack qui contiendra des valeurs de type String. Cette déclaration ressemble beaucoup à celle de toutes les autres collections.

Visual Basic

Dim HTMLTags = New Stack(Of String)

C#

Stack<string> htmlTags = new Stack<string>();

Encore une fois, il est possible de mettre n’importe quel type de données à l’intérieur de la Stack!

Push(T Element)

La méthode Push remplace la méthode Add de la List et représente l’action d’empiler un objet dans ce cas-ci de type String.

Visual Basic

' Empile les objets, on utilise la stack car les objets html fonctionnent dans l'ordre inverse
' pour leur fermeture donc le premier ouvert sera le dernier fermé, comme dans une pile!
' <html><head><title></title></head></html>
HTMLTags.Push("html")
HTMLTags.Push("head")
HTMLTags.Push("title")

C#

// Empile les objets, on utilise la stack car les objets html fonctionnent dans l'ordre inverse
// pour leur fermeture donc le premier ouvert sera le dernier fermé, comme dans une pile!
// <html><head><title></title></head></html>
htmlTags.Push("html");
htmlTags.Push("head");
htmlTags.Push("title");

Peek()

La méthode Peek ne prend aucun argument et sert à lire la valeur sur le dessus de la pile sans pour autant la retirer.

Visual Basic

' Donne accès à l'élément sur le dessus de la pile.
Console.WriteLine("Peeked Tag: " & HTMLTags.Peek())

C#

// Donne accès à l'élément sur le dessus de la pile.
Console.WriteLine("Peeked tag: " + htmlTags.Peek());

Pop()

Supprime et retourne l’élément sur le dessus de la pile (Stack). Attention, vous devez stocker l’élément dans une variable si vous souhaitez le garder, sinon l’élément sera perdu.

Visual Basic

' Retire et retourne l'élément du dessus avec la méthode Pop.
Dim FirstTag As String = HTMLTags.Pop()
Dim SecondTag As String = HTMLTags.Pop()
Dim ThirdTag As String = HTMLTags.Pop()

' Remarquez encore l'ordre inverse qui sera affiché 
' dans la console par rapport à l'ordre dans lequel ils ont été ajoutés.
Console.WriteLine("First Tag: " & FirstTag)
Console.WriteLine("Second Tag: " & SecondTag)
Console.WriteLine("Third Tag: " & ThirdTag)

C#

// Retire et retourner l'élément du dessus avec la méthode Pop.
string firstTag = htmlTags.Pop();
string secondTag = htmlTags.Pop();
string thirdTag = htmlTags.Pop();

// Remarquez encore l'ordre inverse qui sera affiché 
// dans la console par rapport à l'ordre dans lequel ils ont été ajoutés.
Console.WriteLine("First Tag: " + firstTag);
Console.WriteLine("Second Tag: " + secondTag);
Console.WriteLine("Third Tag: " + thirdTag);

Resultat

Cette fenêtre vous montre ce que vous devriez avoir comme résultat à la suite de l’exécution.

Peek Pop

Code complet

Voici le code complet de cet exercice si vous voulez ajouter certains breakpoints pour tenter de mieux comprendre le processus.

Visual Basic

Module Program
    Sub Main()
        Dim HTMLTags = New Stack(Of String)

        ' Empile les objets, on utilise la stack car les objets html fonctionnent dans l'ordre inverse
        ' pour leur fermeture donc le premier ouvert sera le dernier fermé, comme dans une pile!
        ' <html><head><title></title></head></html>
        HTMLTags.Push("html")
        HTMLTags.Push("head")
        HTMLTags.Push("title")

        ' Donne accès à l'élément sur le dessus de la pile.
        Console.WriteLine("Peeked Tag: " & HTMLTags.Peek())

        ' Retire et retourner l'élément du dessus avec la méthode Pop.
        Dim FirstTag As String = HTMLTags.Pop()
        Dim SecondTag As String = HTMLTags.Pop()
        Dim ThirdTag As String = HTMLTags.Pop()

        ' Remarquez encore l'ordre inverse qui sera affiché 
        ' dans la console par rapport à l'ordre dans lequel ils ont été ajoutés.
        Console.WriteLine("First Tag: " & FirstTag)
        Console.WriteLine("Second Tag: " & SecondTag)
        Console.WriteLine("Third Tag: " & ThirdTag)

        Console.ReadKey()
    End Sub
End Module

C#

using System;
using System.Collections.Generic;

namespace StackCSharp
{
    class Program
    {
        static void Main(string[] args)
        {
            Stack<string> htmlTags = new Stack<string>();

            // Empile les objets, on utilise la stack car les objets html fonctionnent dans l'ordre inverse
            // pour leur fermeture donc le premier ouvert sera le dernier fermé, comme dans une pile!
            // <html><head><title></title></head></html>
            htmlTags.Push("html");
            htmlTags.Push("head");
            htmlTags.Push("title");

            // Donne accès à l'élément sur le dessus de la pile.
            Console.WriteLine("Peeked tag: " + htmlTags.Peek());

            // Retire et retourner l'élément du dessus avec la méthode Pop.
            string firstTag = htmlTags.Pop();
            string secondTag = htmlTags.Pop();
            string thirdTag = htmlTags.Pop();

            // Remarquez encore l'ordre inverse qui sera affiché 
            // dans la console par rapport à l'ordre dans lequel ils ont été ajoutés.
            Console.WriteLine("First Tag: " + firstTag);
            Console.WriteLine("Second Tag: " + secondTag);
            Console.WriteLine("Third Tag: " + thirdTag);

            Console.ReadKey();
        }
    }
}

À retenir!

Il est important de garder en tête que la particularité des Generic collections réside dans le fait qu’elles sont fortement typées et que vous pouvez choisir le type de valeur que vous voulez y stocker. Finalement n’oubliez pas que les Collections.Generic (List, Dictionary, Queue et Stack) ne sont pas thread safe, c’est à dire que vous devrez manuellement les proteger lors de l’accès par plusieurs threads. Néanmoins, vous ne devriez pas vous en inquiéter pour le moment, toutefois si vous êtes curieux, vous devriez jeter un coup d’oeil au namespace Concurrency ou encore au mot-clé lock.

Bon code!

Pour plus d’information sur la Stack Generic, vous pouvez consulter le site de Microsoft!

YouTube

Next article Les Collections.Generic en Visual Basic/C# - Exercice et solution
Previous article La (Queue/File) Collections.Generic en Visual Basic

Related posts

0 Comments

No Comments Yet!

You can be first to comment this post!

Leave a Comment

Your data will be safe! Your e-mail address will not be published. Also other data will not be shared with third person. Required fields marked as *