Versuchen Sie, zwei Stapel in Python auf einem Array zu implementieren

Hallo, Es ist eine Nacht seit dem ersten Beitrag vergangen. 196view Danke.

Ich war besonders zufrieden mit den Kommentaren. Vielen Dank, dass Sie @shiracamus. Ich war glücklich. Holen Sie sich den Beispielcode. Darüber hinaus möchte ich Gelegenheit geben, mit den Hinweisen, die ich erneut erhalten habe, nachzudenken.

In Bezug auf den Titel, irgendwo, Sie haben diese Frage gehört, richtig? Ja, ich habe mich selbst herausgefordert (lacht).

Ich bin sicher, Sie werden viele Vorschläge bekommen, Ich werde es mit dem Beschreibungsstil des anderen Tages versuchen. Nein, was ist ein Stapel? https://qiita.com/AKpirion/items/f3d5b51ab2ee9080e9c6 Oder lesen Sie die Artikel anderer Experten. Plötzlich werde ich das ganze Bild schreiben.

stack_x2.py


class top:
    class full(Exception):
        pass
    class empty(Exception):
        pass    
    
    def sel_ptr(self,sel):
        if sel == 0:
            self.ptr = self.ptr0
        else:
            self.ptr = self.ptr1
        return self.ptr
    
    def bak_ptr(self,sel):
        if sel == 0:
            self.ptr0 = self.ptr
        else:
            self.ptr1 = self.ptr

    def __init__(self,capacity:int = 8):
        self.str  = [None] * capacity
        self.capa = capacity/2
        self.ptr0 = 0
        self.ptr1 = 4
        self.ptr  = 0

    def push(self,value,sel):

        top.sel_ptr(self,sel)
        
        if (self.ptr >= self.capa and sel==0) or (self.ptr >= self.capa*2 and sel==1):
            raise top.full
        self.str[self.ptr] = value 
        print(self.str)
        self.ptr += 1
   
        top.bak_ptr(self,sel)     


    def pop(self,sel):
        if sel == 0:
            self.ptr = self.ptr0
        else:
            self.ptr = self.ptr1
            
        if self.ptr <= 4*sel:
            raise top.empty
        self.ptr -= 1
        if sel == 0:
            self.ptr0 = self.ptr
            print(f"ptr0 = {self.ptr0}")
        else:
            self.ptr1 = self.ptr
            print(f"ptr1 = {self.ptr1} ")
        return self.str[self.ptr]

test = top()

while True:
    num = int(input("select 1.push , 2.pop : "))

    if num == 1 :
        s = int(input("enter data: "))
        sel = int(input("select str: "))
        try:
            test.push(s,sel)
        except test.full:
            print("full!")
    elif num == 2:
        sel = int(input("select str: "))
        try:
            x = test.pop(sel)
            print(x)
        except test.empty:
            print("empty!")
    else:
        break

Es tut mir leid, ich habe vergessen, Ihnen die Voraussetzungen zu nennen. str: Box zum Speichern von Daten capa: Die Tiefe von str. Wie viele Daten können gepackt werden? .. ist ptr: Ein Zeiger. Es bedeutet, wo die Daten in str verschoben und wo sie abgelegt werden sollen.

Dieses Mal setze ich capa = 8. Ich werde es mit dem folgenden Bild versuchen. 図1.PNG Beeilen Sie sich wie auf der linken Seite der Abbildung gezeigt und machen Sie eine Schachtel wie zuvor. Teilen Sie es danach in den Bereich 0 <= ptr <= 3 und den Bereich 4 <= ptr <= 7. Ich werde es zu einem Stapel machen.

Sie können sehen, Sie können sehen, jeder? Kennzeichen.

Ich denke, es gibt viele Möglichkeiten, dies zu tun. Ich habe gerade zwei ptrs (ptr0, ptr1) und vorbereitet 0 <= ptr0 <= 3, 4 <= ptr1 <= 7 Soll ich es umschreiben? Ich habe es interpretiert.

Was hast du dann gemacht, Onkel? Ich denke, es wird so sein, also schauen wir es uns Schritt für Schritt an.

stack_x2.py


    def __init__(self,capacity:int = 8):
        self.str  = [None] * capacity
        self.capa = capacity/2  #Teilen Sie die Box in zwei Teile
        self.ptr0 = 0 #1. Zeiger:0 <= ptr0 <=Da es bei 3 arbeitet, ist der Anfangswert 0.
        self.ptr1 = 4 #Zweiter Zeiger:4 <= ptr1 <=Da es bei 7 arbeitet, ist der Anfangswert 4
        self.ptr  = 0 #Nachdem Sie ptr0 oder ptr1 ausgewählt haben, weisen Sie es ptr zu und fahren Sie mit der Stapelverarbeitung fort

Grundsätzlich gilt bei Auswahl von Push / Pop Folgendes: Stellen Sie sicher, dass Sie auswählen, welche Box gespeichert werden soll. Der Weg, dies zu tun, besteht darin, entweder ptr0 oder ptr1 in self.ptr zu ersetzen. Es ist ein Bild, das wie zuvor mit self.ptr pusht / knallt. Lass uns pushen.

Entscheiden Sie zunächst, ob Sie ptr0 oder ptr1 ptr zuweisen möchten. Verwenden Sie sel, um ptr = ptr0 zu setzen, wenn sel == 0 ist, und ptr = ptr1, wenn sel == 1 ist. Das ist die folgende Beschreibung, ich habe sie aus der obigen Beschreibung extrahiert.

stackx2.py


    def sel_ptr(self,sel):
        if sel == 0:
            self.ptr = self.ptr0
        else:
            self.ptr = self.ptr1
        return self.ptr

Klingt okay. Als nächstes kommt der Hauptkörper, der tatsächlich drückt.

stackx2.py


    def push(self,value,sel):

        top.sel_ptr(self,sel)
        
        if (self.ptr >= self.capa and sel==0) or (self.ptr >= self.capa*2 and sel==1):
            raise top.full
        self.str[self.ptr] = value 
        print(self.str)
        self.ptr += 1
   
        top.bak_ptr(self,sel) 

Nachdem Sie ptr0 oder ptr1 durch ptr ersetzt haben, Ob das ausgewählte 1. oder 2. Feld voll ist Muss mit einer if-Anweisung überprüft werden. Ich werde es herausziehen.

stackx2.py


   #sel ==Wenn das erste Feld mit 0 ausgewählt ist#sel ==Wenn das erste Feld mit 0 ausgewählt ist
if (self.ptr >= self.capa and sel==0) or (self.ptr >= self.capa*2 and sel==1):

Wenn Sie bestätigen können, ob es voll ist oder nicht, Wie gewohnt drücken. Ich denke es ist hier vorbei, aber ein bisschen Zeit! Push muss also ptr erhöhen Informationen werden nach Abschluss der Push-Verarbeitung auf ptr0 oder ptr1 erhöht Wenn Sie es nicht aktualisieren, wird es nicht zu einem Stapel.

Daher müssen Sie am Ende des Push-Vorgangs Folgendes hinzufügen. In der Beschreibung gibt es top.bak_ptr (self, sel), aber was Sie tun, ist Die Verarbeitung ist wie folgt.

stackx2.py


    def bak_ptr(self,sel):
        if sel == 0:
            self.ptr0 = self.ptr
        else:
            self.ptr1 = self.ptr

Der letzte ist Pop. Es ist nicht viel anders als Push. Wählen Sie ptr => Auf Leer prüfen => Update ptr => Rückgabewert.

stackx2.py


    def pop(self,sel):
        if sel == 0:
            self.ptr = self.ptr0
        else:
            self.ptr = self.ptr1
            
        if self.ptr <= 4*sel:
            raise top.empty

        self.ptr -= 1

        if sel == 0:
            self.ptr0 = self.ptr
            print(f"ptr0 = {self.ptr0}")
        else:
            self.ptr1 = self.ptr
            print(f"ptr1 = {self.ptr1} ")
        return self.str[self.ptr]

Wie war das. Ich habe die Erklärung zur Beschreibung von Pop weggelassen. Ich fragte mich, ob ich etwas tun könnte, wenn ich Push kenne (lacht)

Was das Gefühl betrifft, so sind die Bedingungen für die Beurteilung von Voll / Leer ptr0 ver, ptr1 ver. Wenn Sie die Bedingungen teilen können, können Sie die Beschreibung des herkömmlichen Stapels verwenden. Ich fragte mich, ob ich überleben könnte.

Die Erklärung ist verschieden!, Nicht genug!, Schwer zu verstehen! Außerdem ist es falsch, verschiedene !!

Es tut mir leid. Wenn Sie einen Kommentar abgeben können, werde ich ihn korrigieren und hinzufügen. m (_ _) m

Recommended Posts

Versuchen Sie, zwei Stapel in Python auf einem Array zu implementieren
Lassen Sie uns Yuma in Python 3 implementieren
Ein Liner in Python
Versuchen Sie gRPC in Python
Probieren Sie 9 Slices in Python aus
Versuchen Sie, die Monte-Carlo-Methode in Python zu implementieren
Versuchen Sie, assoziativen Speicher durch Hop-Field-Netzwerk in Python zu implementieren
Sortieren Sie schnell ein Array in Python 3
Fizzbuzz in Python (in einer Zeile)
Leeres mehrdimensionales Array in Python
DMD in Python 1D
Versuchen Sie LINE Notify mit Python
Versuchen Sie, Yuma in der Sprache Go zu implementieren
Versuchen Sie es mit LevelDB mit Python (plyvel)
Versuchen wir es mit Fizz Buzz mit Python
Versuchen Sie, Trace in Python zu berechnen
Versuchen Sie den Zugriff auf das SPS-Register in Python
Implementierung eines einfachen Algorithmus in Python 2
Versuchen Sie es mit LeapMotion mit Python
Behandeln Sie mehrere Python-Versionen in einem Jupyter
Versuchen Sie, sich mit Python bei qiita anzumelden
CGI Server (1) Python Edition in einer Zeile
Versuchen Sie es mit der Wunderlist-API in Python
Versuchen Sie, die Kraken-API mit Python zu verwenden
Versuchen Sie, mit Binärdaten in Python zu arbeiten
Versuchen Sie, ein SYN-Paket in Python zu senden
Versuchen Sie, eine einfache Animation in Python zu zeichnen
Versuchen Sie Python
Probieren Sie schnell die Microsoft Face API in Python aus
Einzeiler webServer (mit CGI) in Python
Zerlegen Sie Befehlsargumente in einer Zeile in Python
[Python] Bool-Wertinversion in einer Zeile
Versuchen Sie, Ihr Tagebuch mit Python zu durchsuchen
Probieren Sie eine funktionale Programmierpipe in Python aus
Versuchen Sie etwas wie Python für-else in Ruby
[Python] Kombinieren Sie alle Elemente in einem Array
Versuchen Sie, Yuma mit Brainf * ck 512-Zeilen zu implementieren (Code mit Python generieren und ausführen)
Ein Liner, der neunundneunzig in Python ausgibt
Erste Schritte zum Testen von Google CloudVision in Python
Versuchen Sie, Oni Mai Tsuji Miserable mit Python zu implementieren
Berechnen wir das statistische Problem mit Python
3,14 π Tag, versuchen Sie also, in Python auszugeben
Versuchen Sie automatisch, Enum in Python 3.6 automatisch zu bewerten
Wenn ich matplotlib in Python versuche, heißt es'cairo.Context '.
Versuchen Sie es mit der BitFlyer Ligntning API in Python
Ein Liner, der die Kernauslastung von CPU 1 in Python zu 100% erhöht
Versuchen Sie, GeoSpark (Apache Sedona) in einer Python-Umgebung zu installieren
Mach ein Janken-Spiel in einer Zeile (Python)
Versuchen Sie, RPN mit Python zu berechnen (für Anfänger)
Versuchen Sie, mit Mongo in Python auf dem Mac zu arbeiten
Hinweise zur Implementierung einer einfachen Co-Filterung in Python
In einem Fenster werden mehrere Grafiken angezeigt (Python).
Ausgabe in Form eines Python-Arrays
Diejenige, die den Fortschrittsbalken in Python anzeigt
Wählen Sie zufällig Elemente aus der Liste (Array) in Python aus
Beispiel, um Python Kivy in eine Datei zu packen
Versuchen Sie, die ChatWork-API und die Qiita-API in Python zu verwenden