Umkehren von Stack mit Python
Stornieren stack:
- Machte ich einen leeren temporären stack
- Ich verwendet
tempstack.push(stack.pop())
- und dann umbenannt zu
stack = tempstack
aber es scheint nicht zu funktionieren. Irgendeine Idee warum?
Diesen Aufruf, den ich gerade nutzen will reverse(stack)
, nicht stack = reverse(stack)
.
def reverse(stack):
new_stack = Stack()
while not stack.is_empty():
new_stack.push(stack.pop())
stack = new_stack
stack = new_stack
wird nur machen einen Unterschied in der Funktion, was auch immer Objekt, das Sie übergeben wird, bleibt davon unberührt. Betrachtenreturn new_stack
dann tunstack = reverse(stack)
außerhalb.- gut, was andere Wege der Umbenennung oder mutierend new_stack in Stapel?
- Haben Sie in Betracht gezogen, Lesen Sie in der Dokumentation für die Daten-Struktur, die Sie verwenden?
- was ich sagen kann, Ihr eine Liste mit FIFO. Alles, was im fehlt? Ich möchte wirklich nicht, etwas zurückzugeben. Ich möchte nur die Reihenfolge der Werte in den stack. Aber es gibt keine Möglichkeit, dies zu tun, als zu speichern, die pop-Werte in eine temp-Daten-Struktur, die dann das umbenennen der temp-Daten-Struktur in das original meiner Meinung nach.
- Ich denke, Sie sind fehlt @jonrsharpe Punkt. Sie sind nicht die Rückgabe der rückgängig-Stapel. Beim Aufruf von reverse (), die Sie einstellen sollte, gleich zu stapeln und im inneren reverse() liefert den modifizierten stack
- Wenn Sie absolut nicht wollen, um einen Wert zurückzugeben, sollten Sie einen Blick auf dieser Frage.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Als andere wies darauf hin, den letzten Auftrag macht nichts. Jedoch, die Idee hinter der übung ist hier wahrscheinlich nur die standard-stack-primitive
push
,pop
, undis_empty
, ohne sich auf die genaue stack-Implementierung zu nutzenlist.reverse
und so.Der Schlüssel Punkt zu beachten ist, dass der stack ist ein last-in-first-out-Struktur, so dass das Lesen der Inhalt automatisch erzeugt Sie in umgekehrter Reihenfolge. Dies ist der Grund, warum eine Lösung mit einem anderen Stapel für die temporäre Speicherung funktioniert nicht:
Hier die stack-Inhalte bekommen Umgekehrt zweimal: einmal, wenn Sie zu Lesen aus der original-stack, und einmal, wenn Sie Lesen, die Sie aus der temporären stack, so dass Sie am Ende mit stack-Inhalt in original-Reihenfolge. Tatsächlich reverse einem Stapel, müssen Sie extrahieren die Elemente in eine Liste und dann durchqueren Sie um (von Anfang bis Ende), schieben Sie die Elemente auf die ursprünglichen Stapel, wie Sie kommen:
Edit: inspiriert von BrianO ' s Antwort, hier ist eine version, die nicht die Verwendung einer Liste an alle (aber nicht instanziieren zwei temporäre Stapel):
Hier die Idee ist, machen sich die Tatsache zu nutze, dass das kopieren der stack ist Umgekehrt, die Inhalte nur zu kopieren zurück kehrt es wieder. So haben wir nur kopieren Sie Sie dreimal, zuerst aus dem original-stack, um eine temporäre stack, dann von einem temporären stack zu anderen temporären stack, und schließlich von den anderen temporären stapeln auf den ursprünglichen Stapel. Die Umkehrung der Inhalt drei mal endet mit den ursprünglichen Inhalten rückgängig gemacht, was erforderlich war.
list
s, nachdem alle? Die Beschränkungen, die das problem wirklich nicht klar waren.stack._items.reverse()
(oderstack.reverse()
wenn der stack implementiert wurden, wie eine Liste sich selbst). Diese Antwort gar nicht anmaßen, etwas über die Umsetzung vonStack
. Noch, wie ich deine Antwort besser, weil es sich nicht auf eine externe Datenstruktur an alle, es tut seine Magie mit reiner Rekursion.Stack
Umsetzung soll undurchsichtig sein. Ich davon ausgegangen, dass ähnlich würde es "schummeln" (wie in, zu einfach) kopieren Sie die Elemente, um eine zwei-Wege-Struktur wie in einer Liste oder deque. Wenn die Frage ist eine Klasse Zuweisung, die OP werden es früh genug erfahren 😉 PS -- keine "Rekursion" beteiligt.Wenn Sie mit den tatsächlichen
list
s zu implementieren stacks (das ist, wennStack
erbt vonlist
oder im Grunde ist eine Liste), dann einfach in umgekehrterlist
im Ort:Umbenannt habe ich die Funktion
reverse_stack
nur um Verwirrung zu vermeiden; Sie könnte es immer nochreverse
. Beispiel:Jedoch, es scheint, dass Ihre
Stack
Klasse Erben nicht vonlist
aber hält die zugrunde liegendenlist
in einem privaten Attribut, so können Sie nicht direkt verwenden Sie eine derMutableSequence
- API auf eineStack
. DaherVersion2, nur
is_empty
,push
undpop
Methoden derStack
und mit nur
Stack
s, nichtlist
s oderdeque
s usw. Zuerst ein paar Hilfsfunktionen:Nun können wir umsetzen
reverse_stack
:Stack
aber wir wissen nicht, was diese sind. Können Sieappend
oderextend
von der zugrunde liegenden Liste Klasse?list
API zum kopieren der Daten-Struktur, die möglicherweise oder möglicherweise nicht auf deinemStack
Objekte. In der Tat, ist es wahrscheinlich, nicht die Arbeit: von Ihrem früheren Kommentar, es sieht aus wie die zugrunde liegende Liste gespeichert ist, in ein Attributself._items
, soStack
wahrscheinlich ist nicht Erben vonlist
und schneiden eineStack
ist wohl nicht definiert.Fügen Sie eine return-Wert
und beim aufrufen der Funktion dazu:
Zuweisung Wert auf stack innerhalb der Funktion aber nicht von wo Sie es nannte. Probleme mit Umfang.
Sieht es aus wie Sie geschrieben haben soll
while not stack.is_empty():
(Nach dem edit) Ok, jetzt statt
stack = new_stack
es sagen solltereturn new_stack
. Die Funktion sollte aufgerufen werden, mitstack = reverse(stack)
.(Antwort auf Kommentare), Wenn die Rückgabe ein Wert ist nicht eine option, dann müssen wir wissen, welche Methoden es gibt, um zu ändern, Stack-Objekte. Sagen
stack = new_stack
oderstack = Stack()
wird sich nicht ändern, es außerhalb der Funktion.Etwas wie dies funktionieren sollte:
Aber es ist wahrscheinlich eine schlechte Idee da der Unterstrich vor
_items
zeigt, dass wer schrieb die Stack-Klasse gar nicht wollen, es zu sein verwendet auf diese Weise.Plus @user4815162342 wies darauf hin, das vermutlich kehrt der Stapel doppelt, also anstelle der Verwendung einer temporären
new_stack = Stack()
sollten wir einfach die Verwendung einer temporären Liste. Wirklich @user4815162342 s Antwort ist die beste.while stack:
, wenn die Umsetzung sinnvoll ist.None
geeignet ist), aber ohne Kenntnis der Implementierung können wir Ihnen nicht sagen, wie.Wenn der Stack-Klasse wird Ihre eigenen oder Sie können Sie zu erweitern, dann ist ein anderer Weg, die Umkehrung der Stapel wäre, um alle die Daten zu erhalten, und verfolgen Sie die Art und Weise, bis Ihr stack (wächst nach oben oder unten) und entweder push/pop auf der Ober-oder der Unterseite des Stapels abhängig von der stack-Richtung. Ihr stack-Methode "reverse" ist dann einfach ein Fall der änderung des flag bestimmt, ob der stack wächst nach oben oder unten.
Habe ich keinen code noch, aber wenn Ihr stack groß ist dann die änderung ein flag kann gut sein, viel einfacher, als die Umkehrung einer großen Liste von Daten.
Kopieren Sie den Stapel zuerst leeren Sie den original-stack, dann Folgen Sie Ihrer Methode.
old_stack = stack
nicht eine Kopie erstellenold_stack = stack[:]
tut.Stack
s. Es entsteht in der Tat, dass es wohl nicht kopieren Sie diese auf alle. Die Klasse wohl nicht Erben auslist
ab, lässt aber die zugrunde liegende Liste in einem privaten Attribut. Ich Sprach in meiner Antwort & Kommentare im Vorfeld der Version2 gibt.