Comment implémenter une fonctionnalité de type pile à l'aide des canaux Go
Les canaux de Go sont intrinsèquement conçus comme le premier entré, premier sorti (FIFO) files d'attente. Bien que ce comportement soit adapté à de nombreux scénarios, il peut y avoir des situations dans lesquelles une structure de type pile dernier entré, premier sorti (LIFO) est souhaitable.
Cet article vise à expliquer pourquoi les canaux ne peuvent pas être directement modifiés pour se comportent comme des piles et fournit une solution alternative en utilisant le package conteneur/heap.
Pourquoi les canaux ne sont pas des piles
Les canaux utilisent un tampon circulaire sous-jacent pour stocker les éléments, garantissant que les éléments sont récupérés dans l’ordre dans lequel ils ont été ajoutés. Ce comportement FIFO garantit que le premier élément ajouté est également le premier élément récupéré. La mise en œuvre du comportement LIFO nécessiterait un changement fondamental dans la structure interne du canal, ce qui n'est pas réalisable.
Utilisation d'un tas pour la fonctionnalité de pile
Le package conteneur/heap fournit structures de données de tas qui prennent en charge le principe LIFO. Un tas organise les éléments de manière à garantir que le dernier élément ajouté se trouve à la racine du tas et peut être récupéré efficacement.
L'extrait de code suivant montre comment créer une pile basée sur un tas :
<code class="go">import ( "container/heap" ) type Stack []int func (s Stack) Len() int { return len(s) } func (s Stack) Less(i, j int) bool { return s[i] > s[j] } func (s Stack) Swap(i, j int) { s[i], s[j] = s[j], s[i] } func (s *Stack) Push(x interface{}) { heap.Push(s, x.(int)) } func (s *Stack) Pop() (v int) { v = heap.Pop(s).(int) return v }</code>
Cette pile personnalisée vous permet de pousser et de faire apparaître des éléments, se comportant efficacement comme une pile LIFO. Bien qu'il ne modifie pas directement les canaux sous-jacents, il fournit une interface de type pile pour récupérer des éléments.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!