So implementieren Sie einen Stack mit Push und Pop in Dart
Ich möchte eine Stapeldatenstruktur (nicht zu verwechseln mit dem Flutter-Stapel-Widget) in Dart implementieren, damit ich einen Stapel benutzerdefinierter TextStyles für das Flutter-Text-Rendering verarbeiten kann.
Ich weiß, dass man mit Stack Werte pushen und platzen kann. Das klingt ähnlich wie Queue, aber ich bin mir des Unterschieds nicht sicher.
Das funktioniert nicht:
final myStack = Queue<int>();
myStack.push(1);
final top = myStack.pop();
Antworten
Der Code aus dem Stapelpaket war hilfreich. Hier ist eine vereinfachte Version:
class Stack<T> {
final _stack = Queue<T>();
void push(T element) {
_stack.addLast(element);
}
T pop() {
T lastElement = _stack.last;
_stack.removeLast();
return lastElement;
}
}
Anmerkungen:
A
Queueermöglicht das Ändern beider Enden und ist standardmäßig aListQueue. Weitere Informationen hierzu finden Sie in dieser Frage .Durch Drücken wird die Warteschlange erweitert, und durch Poppen wird das letzte Element entfernt und dieses Element zurückgegeben.
Sie können auch einen
topGetter hinzufügen, um zu sehen, was das letzte Element ist, ohne es zu knallen.
Verwendung
Sie können es jetzt so verwenden:
final myStack = Stack<int>();
myStack.push(1);
final top = myStack.pop();
Hier ist die Klasse, die ich benutze
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;
}
Meine Version eines Queue-Wrappers:
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);
}