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. 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