Como implementar uma pilha com push e pop no Dart

Sep 25 2020

Eu gostaria de implementar uma estrutura de dados de pilha (não deve ser confundida com o widget Flutter Stack) no Dart para que eu possa lidar com uma pilha de TextStyles personalizados para renderização de texto Flutter.

Eu sei que com a pilha você pode empurrar e aumentar os valores. Isso soa semelhante a Fila, mas não tenho certeza da diferença.

Isso não funciona:

final myStack = Queue<int>();
myStack.push(1);
final top = myStack.pop();

Respostas

2 Suragch Sep 25 2020 at 15:55

O código do pacote de pilha foi útil. Aqui está uma versão simplificada:

class Stack<T> {
  final _stack = Queue<T>();

  void push(T element) {
    _stack.addLast(element);
  }

  T pop() {
    T lastElement = _stack.last;
    _stack.removeLast();
    return lastElement;
  }
}

Notas:

  • A Queuepermite que você modifique as duas extremidades e é, por padrão, a ListQueue. Veja esta pergunta para mais informações sobre isso.

  • Empurrar é adicionar à fila e popping é remover o último elemento e, em seguida, retornar esse elemento.

  • Você também pode adicionar um topgetter para ver qual é o último elemento sem abri-lo.

Uso

Você pode usá-lo assim agora:

final myStack = Stack<int>();
myStack.push(1);
final top = myStack.pop();
1 alirezaeasazade Oct 13 2020 at 21:21

aqui está a classe que eu uso

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

Minha versão de um wrapper de fila:

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