Como implementar uma pilha com push e pop no Dart
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
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, aListQueue. 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();
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;
}
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);
}