Essayez d'implémenter deux piles en Python sur un seul tableau

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. 図1.PNG 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

Essayez d'implémenter deux piles en Python sur un seul tableau
Implémentons Yuma dans Python 3
Une doublure en Python
Essayez gRPC en Python
Essayez 9 tranches en Python
Essayez d'implémenter la méthode Monte Carlo en Python
Essayez d'implémenter la mémoire associative par hop field network en Python
Tri rapide d'un tableau en Python 3
Fizzbuzz en Python (en une ligne)
Tableau multidimensionnel vide en python
DMD en Python 1D
Essayez LINE Notify avec Python
Essayez d'implémenter Yuma en langage Go
Essayez d'utiliser LevelDB avec Python (plyvel)
Essayons Fizz Buzz avec Python
Essayez de calculer Trace en Python
Essayez l'accès au registre PLC en Python
Implémentation d'un algorithme simple en Python 2
Essayez d'utiliser LeapMotion avec Python
Gérez plusieurs versions de python en un seul jupyter
Essayez de vous connecter à qiita avec Python
CGI Server (1) édition python en une ligne
Essayez d'utiliser l'API Wunderlist en Python
Essayez d'utiliser l'API Kraken avec Python
Essayez de travailler avec des données binaires en Python
Essayez d'envoyer un paquet SYN en Python
Essayez de dessiner une animation simple en Python
Essayez Python
Essayez rapidement l'API Face de Microsoft en Python
Un serveur Web de ligne (avec CGI) en python
Décomposer les arguments de commande en une seule ligne en Python
[Python] Inversion de valeur booléenne en une ligne
Essayez de fouiller votre journal avec Python
Essayez un tube de programmation fonctionnel en Python
Essayez quelque chose comme Python for-else dans Ruby
[Python] Combine tous les éléments dans un tableau
Essayez d'implémenter Yuma avec Brainf * ck 512 lignes (générer et exécuter du code avec Python)
Une doublure qui produit quatre-vingt-dix-neuf en Python
Premiers pas pour essayer Google CloudVision en Python
Essayez d'implémenter Oni Mai Tsuji Miserable avec python
Calculons en fait le problème statistique avec Python
3.14 π jour, alors essayez de sortir en Python
Essayez auto pour évaluer automatiquement Enum dans Python 3.6
Quand j'essaye matplotlib en Python, il dit 'cairo.Context'
Essayez d'utiliser l'API BitFlyer Ligntning en Python
Une doublure qui rend l'utilisation du cœur du CPU 1 à 100% en Python
Essayez d'installer GeoSpark (Apache Sedona) dans un environnement Python
Créez un jeu Janken en une seule ligne (python)
Essayez de calculer RPN avec Python (pour les débutants)
Essayez de travailler avec Mongo en Python sur Mac
Notes pour la mise en œuvre d'un co-filtrage simple en Python
Plusieurs graphiques sont affichés dans une seule fenêtre (python)
Sortie sous la forme d'un tableau python
Celui qui affiche la barre de progression en Python
Sélectionnez au hasard des éléments dans la liste (tableau) en python
Exemple pour mettre Python Kivy dans un fichier
Essayez d'utiliser l'API ChatWork et l'API Qiita en Python