So implementieren Sie einen Stack mit Push und Pop in Dart

Sep 25 2020

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

2 Suragch Sep 25 2020 at 15:55

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

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;

}
theanurin Dec 10 2020 at 06:27

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