Un petit problème pour approfondir la compréhension de la pile LIFO (python)

Aujourd'hui , quelqu'un m'a posé une question, comme suit:
Insérer ici l'image Description
signifie qu'un ordre donné de 654321 pile, la pile de déterminer si ce qui suit est vrai.

idées de résolution de problèmes

Et en utilisant l'élément de mémoire de la pile est de suivre un dernier entré , premier sorti (DEPS), comme indiqué ci - dessous, nous pouvons utiliser une boîte semi-ouverte représente une pile, la pile est appelée extrémité ouverte, qui extrémité est engagée en push (push) et le fonctionnement de la pile (pop).
Insérer ici l'image Description
Pour une séquence donnée d'être déterminée, par exemple lorsque l'option A 453 126, on peut déduire séquentiellement exécuté dans cet ordre de succession,

  • Le premier est le premier élément 4, on peut utiliser cet élément « 4 » de la pile d'originaux en deux, à savoir une première étape, la gauche est le poids de la pile d'originaux, le droit à st_tmp, attention à la direction du st_tmp d'ouverture opposé.
  • Ensuite, nous avons d'abord déterminer si le courant traverse st sommet de l'élément de pile « 4 », si elle est pour le faire sortir, et traverse l'élément suivant « 5 », en tant que deuxième étape,
  • Dans la même opération, nous sommes arrivés à la troisième étape. Cette fois-ci pour traverser l'élément « 3 », cette fois-ci sur la partie supérieure gauche de la pile ne signifie pas st élément « 3 », donc nous devons trouver dans l'ordre du haut de la pile de st_tmp st et pousser vers la gauche, puis sortir, cette étape peut être simplifiée sortie directe pop.
  • En traversant la quatrième étape de « 1 », nous constatons que le côté gauche du haut de la pile st pas le droit st_tmp haut de la pile ne pas, à ce moment nous allons st_tmp pousser successivement le sommet de la pile vers la gauche jusqu'à ce que vous trouverez en haut de la pile est égale à st_tmp A ce stade, l'élément de déplacement « 1 » jusqu'à présent. Si à ce moment, pop, malheureusement, tous les éléments de st_tmp sont également aucun élément trouvé « 1 », ce qui indique que la séquence n'est pas la séquence correcte
  • Heureusement, il était encore trouvé des éléments « 1 » et pop out, comme la sixième étape
  • Les étapes suivantes sont identiques à l'opération, si le dernier pop succès sur tous les éléments de st et st_tmp, ce qui indique que la séquence est correcte, à savoir, la séquence d'origine peut être obtenue 654321 pile à travers une série de push / pop étape.

code mise en œuvre

Code est mis en œuvre comme suit, où non seulement peut réaliser la détermination 654321, 4321 également d'obtenir un autre numéro de cette détermination, il suffit de variables de changement npeut, non seulement le nombre, la même pour tout pile, comme 343453, etc., il suffit de changer l'initialisation de la pile il peut être.

class StackUnderflow(ValueError):
    '''自定义栈相关的异常类
    '''
    pass

class SStack:
    '''基于顺序表实现的栈类
    '''

    def __init__(self):
        self._elems = []  # 用list对象 _elems存储栈中元素

    def is_empty(self):
        return self._elems == []

    def top(self):  # 取得最后压入的元素,即栈顶
        if self._elems == []:
            raise StackUnderflow("in SStack.pop()")
        else:
            return self._elems[-1]

    def push(self, elem):  # 压栈
        self._elems.append(elem)

    def pop(self):  # 出栈
        if self._elems == []:
            raise StackUnderflow("in SStack.pop()")
        return self._elems.pop()

    def elems(self):
        elems = self._elems
        return elems


st = SStack()
flag = True
# n = int(input("栈元素个数:"))
n = 6 # n也可以改为其他的
for i in range(n, 0, -1):
    st.push(i)
st_tmp = SStack()
input_series = input("输入待判断序列")
series_list = list(map(int, input_series))
print(series_list)

while not st.top() == series_list[0]:  # 以待判断序列首元素为界,将原栈一分为二
    st_tmp.push(st.top())
    st.pop()

for serie in series_list:
    if (not st.is_empty()) and serie == st.top():
        st.pop()
    else:
        if st_tmp.is_empty():
            flag = False
        else:
            while not serie == st_tmp.top():
                st.push(st_tmp.top())
                st_tmp.pop()
                if st_tmp.is_empty():
                    break
            if st_tmp.is_empty():
                flag = False
            else:
                st_tmp.pop()
    if flag == False:
        break

print(flag)

post-scriptum

Si vous pensez que cet article utile, bienvenue pouces + collecte pour fournir un flux régulier de blogueurs plus de texte de puissance. Aussi une attention bienvenue au numéro personnel du public, le code à deux dimensions comme suit:
Alt

Publié 95 articles originaux · louange gagné 30 · vues 40000 +

Je suppose que tu aimes

Origine blog.csdn.net/JohnJim0/article/details/105208210
conseillé
Classement