Bonjour, Cela fait une nuit depuis le premier post. 196view Merci.
J'ai été particulièrement satisfait des commentaires. Merci @shiracamus. J'étais heureux. Obtenez l'exemple de code. De plus, je voudrais donner l'occasion de réfléchir à nouveau aux indices que j'ai reçus.
Concernant le titre, quelque part, Vous avez entendu cette question, non? Oui, je me suis lancé un défi (rires).
Je suis sûr que vous aurez beaucoup de suggestions, Je vais l'essayer avec le style de description de l'autre jour. Non, qu'est-ce qu'une pile!? https://qiita.com/AKpirion/items/f3d5b51ab2ee9080e9c6 Ou, veuillez vous référer aux articles d'autres experts. Soudain, j'écrirai l'image entière.
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
Je suis désolé, j'ai oublié de vous dire les prérequis. str: Boîte pour stocker des données capa: La profondeur de str. Alors, combien de données peuvent être compressées? .. est ptr: un pointeur. Cela signifie où pousser les données dans str et où les extraire.
Cette fois, j'ai mis capa = 8. Je vais l'essayer avec l'image suivante. Dépêchez-vous comme indiqué sur le côté gauche de la figure et faites une boîte comme avant. Après cela, divisez-le en la zone de 0 <= ptr <= 3 et la zone de 4 <= ptr <= 7. Je vais en faire une pile.
Vous pouvez voir, vous pouvez voir, tout le monde? marque.
Je pense qu'il y a plusieurs façons de le faire, Je viens de préparer deux ptrs (ptr0, ptr1) et 0 <= ptr0 <= 3, 4 <= ptr1 <= 7 Dois-je le réécrire? Je l'ai interprété.
Alors qu'avez-vous fait, mon oncle!? Je pense que ce sera le cas, alors jetons un coup d'œil étape par étape.
stack_x2.py
def __init__(self,capacity:int = 8):
self.str = [None] * capacity
self.capa = capacity/2 #Divisez la boîte en deux
self.ptr0 = 0 #1er pointeur:0 <= ptr0 <=Puisqu'il fonctionne à 3, la valeur initiale est 0.
self.ptr1 = 4 #Deuxième pointeur:4 <= ptr1 <=Puisqu'il fonctionne à 7, la valeur initiale est 4
self.ptr = 0 #Après avoir sélectionné ptr0 ou ptr1, affectez-le à ptr et passez au traitement de la pile
En gros, lorsque vous choisissez Push / Pop, Assurez-vous de choisir la boîte à stocker. La méthode consiste à remplacer ptr0 ou ptr1 par self.ptr. C'est une image qui pousse / apparaît avec self.ptr comme avant. Poussons.
Tout d'abord, décidez si vous souhaitez affecter ptr0 ou ptr1 à ptr. Utilisez sel pour définir ptr = ptr0 lorsque sel == 0 et ptr = ptr1 lorsque sel == 1. C'est la description suivante, je l'ai extraite de la description ci-dessus.
stackx2.py
def sel_ptr(self,sel):
if sel == 0:
self.ptr = self.ptr0
else:
self.ptr = self.ptr1
return self.ptr
Ça me va. Vient ensuite le corps principal qui pousse réellement.
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)
Après avoir remplacé ptr0 ou ptr1 par ptr, Si la 1ère ou la 2ème case sélectionnée est pleine Doit être vérifié avec une instruction if. Je vais le retirer.
stackx2.py
#sel ==Lorsque la première case est sélectionnée avec 0#sel ==Lorsque la première case est sélectionnée avec 0
if (self.ptr >= self.capa and sel==0) or (self.ptr >= self.capa*2 and sel==1):
Si vous pouvez confirmer s'il est complet ou non, Poussez comme d'habitude. Je pense que c'est par ici, mais un peu de temps! Push doit incrémenter ptr, donc Informations incrémentées à ptr0 ou ptr1 une fois le traitement Push terminé Si vous ne le mettez pas à jour, il ne deviendra pas une pile.
Par conséquent, vous devez ajouter les éléments suivants à la fin du processus Push. Dans la description, il y a top.bak_ptr (self, sel), mais ce que vous faites est Le traitement est le suivant.
stackx2.py
def bak_ptr(self,sel):
if sel == 0:
self.ptr0 = self.ptr
else:
self.ptr1 = self.ptr
Le dernier est Pop. Ce n'est pas très différent de Push. Sélectionnez ptr => Check for Empty => Update ptr => return value.
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]
Comment était-ce. J'ai omis l'explication sur la description de Pop, Je me suis demandé si je pouvais faire quelque chose si je connaissais Push (rires)
En ce qui concerne la sensation, les conditions pour juger Plein / Vide sont ptr0 ver, ptr1 ver. Si vous pouvez diviser les conditions, vous pouvez utiliser la description de la pile conventionnelle. Je me suis demandé si je pouvais survivre.
L'explication est diverse!, Pas assez!, Difficile à comprendre! En plus, c'est faux, divers !!
Je suis désolé. Si vous pouvez commenter, je vais le corriger et l'ajouter. m (_ _) m
Recommended Posts