Comment implémenter une pile avec push and pop dans Dart

Sep 25 2020

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

2 Suragch Sep 25 2020 at 15:55

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 a ListQueue. 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();
1 alirezaeasazade Oct 13 2020 at 21:21

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;

}
theanurin Dec 10 2020 at 06:27

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);
}