Comment implémenter une pile avec push and pop dans Dart
Je voudrais implémenter une structure de données de pile (à ne pas confondre avec le widget Flutter Stack) dans Dart afin que je puisse gérer une pile de TextStyles personnalisés pour le rendu de texte Flutter.
Je sais qu'avec stack, vous pouvez pousser et faire apparaître des valeurs. Cela ressemble à Queue, mais je ne suis pas sûr de la différence.
Cela ne fonctionne pas:
final myStack = Queue<int>();
myStack.push(1);
final top = myStack.pop();
Réponses
Le code du package de pile était utile. Voici une version simplifiée:
class Stack<T> {
final _stack = Queue<T>();
void push(T element) {
_stack.addLast(element);
}
T pop() {
T lastElement = _stack.last;
_stack.removeLast();
return lastElement;
}
}
Remarques:
A
Queuevous permet de modifier les deux extrémités et est par défaut aListQueue. Voir cette question pour plus d'informations à ce sujet.Pushing ajoute à la file d'attente et popping supprime le dernier élément, puis retourne cet élément.
Vous pouvez également ajouter un
topgetter pour voir quel est le dernier élément sans le faire sauter.
Usage
Vous pouvez l'utiliser comme ceci maintenant:
final myStack = Stack<int>();
myStack.push(1);
final top = myStack.pop();
voici la classe que j'utilise
import 'dart:collection';
class Stack<T> {
final _stack = Queue<T>();
int get length => _stack.length;
bool canPop() => _stack.isNotEmpty;
void clearStack(){
while(_stack.isNotEmpty){
_stack.removeLast();
}
}
void push(T element) {
_stack.addLast(element);
}
T pop() {
T lastElement = _stack.last;
_stack.removeLast();
return lastElement;
}
T peak() => _stack.last;
}
Ma version d'un wrapper de file d'attente:
import "dart:collection" show Queue;
class Stack<T> {
final Queue<T> _underlyingQueue;
Stack() : this._underlyingQueue = Queue<T>();
int get length => this._underlyingQueue.length;
bool get isEmpty => this._underlyingQueue.isEmpty;
bool get isNotEmpty => this._underlyingQueue.isNotEmpty;
void clear() => this._underlyingQueue.clear();
T peek() {
if (this.isEmpty) {
throw StateError("Cannot peek() on empty stack.");
}
return this._underlyingQueue.last;
}
T pop() {
if (this.isEmpty) {
throw StateError("Cannot pop() on empty stack.");
}
return this._underlyingQueue.removeLast();
}
void push(final T element) => this._underlyingQueue.addLast(element);
}