[PYTHON] Erreichen Sie eine Warteschlange mit zwei Stapeln

Guten Abend.

Danke für Ihre Unterstützung. Es scheint, dass mein Artikel für alle nützlich ist Ich bin sehr glücklich (≧ ▽ ≦)

Das Zusammenfassen des eigenen Verständnisses organisiert auch das eigene Verständnis Zwei Fliegen mit einer Klappe! (* ´ 艸 `)

Nun zum Titel, Es ist ein interessantes Thema, nicht wahr? Lass es uns sofort tun. Welche Art von Befreiung haben Sie sich vorgestellt?

Ich dachte, dass dies erreicht werden könnte, indem ein dedizierter Stack für Push bzw. Pop vorbereitet wird. Bewahren Sie es beispielsweise beim Drücken in dem Bereich auf, der dem Drücken gewidmet ist. Bei Pop werden die Daten nur von Push nach Pop übertragen. Das ist cool! ????? Lassen Sie uns vorerst Schritt für Schritt ein Bild erstellen.

** 1. Für Push ** Die Daten werden auf dem dedizierten Push-Computer gespeichert. Die Daten wurden in der Reihenfolge A => B => C => D => E => F verschoben. Es gibt kein Problem. Werfen wir einen Blick auf die Nur-Pop-Maschine. Die Adresse wird für alle Fälle von 0 bis 5 vergeben, ist aber vorerst leer. 図1.PNG

** 2. Für Pop ** Extrahieren Sie Daten von der dedizierten Push-Maschine in Form eines Stapels. Ich werde auf die Pop-dedizierte Maschine pushen. In diesem Zustand lautet die Reihenfolge von der Pop-dedizierten Maschine aus F => E => D => C => B => A. Ist es nicht so, weil du drängen wirst? 図2.PNG Wenn Sie danach wie ein Stapel von der Pop-dedizierten Maschine springen, Die Bewegung ist ein Stapel, aber stimmt die Ausgabe des Systems nicht mit der Warteschlange überein?

Irgendwie habe ich ein Bild, also lass es uns schreiben. Die Basis basiert auf dem vorherigen Artikel. https://qiita.com/AKpirion/items/b1bad123aebe72f35a77

stack_x2_queue.py


    def __init__(self,size):
        self.INstr = []  #Drücken Sie die dedizierte Maschine
        self.OUTstr = [] #Pop dedizierte Maschine
        self.size = size

Als nächstes spielt es überhaupt keine Rolle. Lassen Sie den Abzug vorerst beiseite Push-Daten für dedizierte Maschinen (oder Pop-dedizierte Maschinen) Ich wollte die Beschreibung verwenden, um auf die entwurzelte Pop-dedizierte Maschine (oder Push-dedizierte Maschine) zu übertragen.

stack_x2_queue.py


    #Wechsel von einer Nur-Push-Maschine zu einer Nur-Pop-Maschine
    def trans_IN2OUT(self):
        #Entwurzelte Bewegung der vorhandenen gespeicherten Datenlänge
        for _ in range(len(self.INstr)):
            self.OUTstr.append(self.INstr.pop())
    #Wechsel von einer Nur-Pop-Maschine zu einer Nur-Push-Maschine
    def trans_OUT2IN(self):
        #Entwurzelte Bewegung der vorhandenen gespeicherten Datenlänge
        for _ in range(len(self.OUTstr)):
            self.INstr.append(self.OUTstr.pop())

Im Moment ist es in Ordnung zu schreiben, was Sie schreiben möchten, Was soll ich tun (* ´ω `) Es bleibt keine andere Wahl, als zu Tsuji match zu passen (lacht)

Beginnen wir mit Push. Egal wie viele Daten ich auf dem Push-dedizierten Computer habe Wenn die Datenlänge des Pop-dedizierten Computers 0 ist, dachte ich, es wäre gut, wenn ich auf den Push-dedizierten Computer pushen könnte. Wenn die Datenlänge des Pop-dedizierten Computers nicht 0 ist, Verwenden Sie def trans_OUT2IN (self), um von einem Nur-Pop-Computer zu einem Nur-Push-Computer zu wechseln Bewege alles. Danach habe ich es so gemacht, dass ich mit Wiederholung pushen konnte.

stack_x2_queue.py


    def push(self,value):
        #Überprüfen Sie, ob der Push-dedizierte Computer voll ist
        if len(self.INstr) >= self.size:
        #Ausnahmebehandlung, wenn voll
            raise Stack.full
        #Beurteilen Sie, ob die Pop-Maschine leer ist
        if len(self.OUTstr) == 0:
        #Wenn es leer ist, drücken Sie auf eine dedizierte Push-Maschine!
            self.INstr.append(value)
        else:
        #Wenn es nicht leer ist, verschieben Sie alle Daten vom Pop-dedizierten Computer auf den Push-dedizierten Computer
            Stack.trans_OUT2IN(self)
        #Wenn len rekursiv verwendet(self.OUTstr) ==Ersetzen Sie die Daten durch 0 und drücken Sie
            Stack.push(self,value)

Fügen Sie die Funktion hinzu, die Sie mit def hinzufügen möchten. Füllen Sie die Lücken aus, indem Sie die Beschreibung in jedem Def anpassen. .. Ist es okay das zu tun? (゚ Ω ゚) Pokhan (゚ Д ゚ y) y! ?? Ich bin mir sicher, dass es einen logischen Weg gibt, damit umzugehen. Ich möchte studieren

Nun, willst du als nächstes gehen, Pop.

Es ist im Grunde das Gegenteil von Push. Wenn die auf dem dedizierten Push-Computer gespeicherte Datenlänge 0 ist, Pop von einer dedizierten Pop-Maschine. In anderen als den oben genannten Fällen alle Daten von der Push-dedizierten Maschine Wechseln Sie zur Pop-Maschine. Ich denke, es wird wie folgt aussehen.

stack_x2_queue.py


    def pop(self):
        #Wenn der Push-dedizierte Computer leer ist, öffnen Sie ihn vom Pop-dedizierten Computer
        if len(self.INstr) == 0:
            print(f"pop data is {self.OUTstr.pop()}")
        else:
        #Verschieben Sie alle Daten von einem dedizierten Push-Computer auf einen dedizierten Pop-Computer
            Stack.trans_IN2OUT(self)
        #Wenn len rekursiv verwendet(self.INstr) ==Rufen Sie die 0-Bedingung erneut auf
            Stack.pop(self)

Das Ganze sieht so aus.

stack_x2_queue.py


class Stack:
    class full(Exception):
        pass
    def __init__(self,size):
        self.INstr = []
        self.OUTstr = []
        self.size = size
    def push(self,value):
        if len(self.INstr) >= self.size:
            raise Stack.full
        if len(self.OUTstr) == 0:
            self.INstr.append(value)
        else:
            Stack.trans_OUT2IN(self)
            Stack.push(self,value)
    def pop(self):
        if len(self.INstr) == 0:
            print(f"pop data is {self.OUTstr.pop()}")
        else:
            Stack.trans_IN2OUT(self)
            Stack.pop(self)
    def view(self):
        print(self.INstr)
        print(self.OUTstr)
    def trans_IN2OUT(self):
        for _ in range(len(self.INstr)):
            self.OUTstr.append(self.INstr.pop())
    def trans_OUT2IN(self):
        for _ in range(len(self.OUTstr)):
            self.INstr.append(self.OUTstr.pop())

x = int(input("stack size is "))
test = Stack(x)  
    
while True:
    num = int(input("1.push 2.pop: "))

    if num == 1:
        x = int(input("push data is "))
        try:
            test.push(x)
            test.view()
        except:
            print("Full!")
    elif num == 2:
        try:
            test.pop()
            test.view()
        except:
            print("Empty!")
    else:
        break

Das Ausführungsergebnis wird ebenfalls gebucht.

stack size is 4

1.push 2.pop: 1

push data is 1 #Drücken Sie 1
[1]            #Drücken Sie die dedizierte Maschine
[]             #Pop dedizierte Maschine

1.push 2.pop: 1

push data is 2 #Drücken Sie 2
[1, 2]         #Drücken Sie die dedizierte Maschine
[]             #Pop dedizierte Maschine

1.push 2.pop: 1

push data is 3 #Drücken Sie 3
[1, 2, 3]      #Drücken Sie die dedizierte Maschine
[]             #Pop dedizierte Maschine

1.push 2.pop: 1

push data is 4 #Drücken Sie 4
[1, 2, 3, 4]   #Drücken Sie die dedizierte Maschine
[]             #Pop dedizierte Maschine

1.push 2.pop: 2
pop data is 1  #Pop 1 von einer dedizierten Pop-Maschine
[]             #Drücken Sie die dedizierte Maschine
[4, 3, 2]      #Pop dedizierte Maschine

1.push 2.pop: 2
pop data is 2  #Pop 2 von einer dedizierten Pop-Maschine
[]             #Drücken Sie die dedizierte Maschine
[4, 3]         #Pop dedizierte Maschine

1.push 2.pop: 1

push data is 2 #Push Geben Sie die Daten an das dedizierte Gerät zurück und drücken Sie 2
[3, 4, 2]      #Drücken Sie die dedizierte Maschine
[]             #Pop dedizierte Maschine

1.push 2.pop: 1

push data is 1
[3, 4, 2, 1]
[]

1.push 2.pop: 2
pop data is 3
[]
[1, 2, 4]

1.push 2.pop: 2
pop data is 4
[]
[1, 2]

1.push 2.pop: 2
pop data is 2
[]
[1]

1.push 2.pop: 2
pop data is 1
[]
[]

Unterwegs hörte ich auf zu ergänzen. Nachdem Sie bei jedem Push and Pop alle Daten an jeden dedizierten Computer gesendet haben Es scheint schwierig zu sein, die Vielseitigkeit aufrechtzuerhalten, ohne zu Push- und Pop-Aktionen (= ω =) y─┛ ○ o zu wechseln.

Wenn in der von der Nur-Push-Maschine oder der Nur-Pop-Maschine definierten Bewegung ein Fehler in Voll oder Leer auftritt, wird die Ausnahmeverarbeitung gestartet, sodass keine Änderungen erforderlich sind.

Vielen Dank für Ihre harte Arbeit ^^) _ Dan ~~

Recommended Posts

Erreichen Sie eine Warteschlange mit zwei Stapeln
Erstellen Sie einen Stapel mit einer Warteschlange und eine Warteschlange mit einem Stapel (von LetCode / Implement Stack using Queues, Implement Queue using Stacks)
Spielen Sie den Server mit zwei PCs
A4 Größe mit Python-Pptx
Mit Dekorateur dekorieren
Python-Zeichnet eine Kurve mit gleichem Maharanobis-Abstand von zwei Datensätzen
Lernen Sie Librosa mit einem Tutorial 1
Zeichnen Sie mit NetworkX ein Diagramm
Versuchen Sie, mit einer Shell zu programmieren!
Erstellen Sie eine Homepage mit Django
Verwenden eines Druckers mit Debian 10
Machen Sie eine Lotterie mit Python
Kombiniere zwei Bilder mit Django
Erstellen Sie ein Verzeichnis mit Python
Ein bisschen im Kettenschiff stecken
Zeichnen Sie mit networkx ein Diagramm
Einfach cProfile mit einem Dekorateur
Machen Sie ein Feuer mit kdeplot