Ein kleines Problem, das Verständnis des Stapels LIFO (Python) zu vertiefen

Heute fragte mich jemand eine Frage, wie folgt:
Hier hat Bild einfügen Beschreibung
bedeutet , dass eine bestimmte Reihenfolge von 654321 Stapel, der Stapel bestimmen , ob die folgenden Bedingungen erfüllt ist.

Ideen zur Problemlösung

Und der Stapelspeicherelement verwendet , ist ein last in first out (LIFO) zu folgen, wie unten gezeigt, können wir eine halboffene Kasten stellt einen Stapel verwenden, wird der Stapel offene Ende genannt wird , welches Ende in push (push) in Eingriff ist und der Stapel (POP) -Betrieb.
Hier hat Bild einfügen Beschreibung
Für eine gegebene Sequenz bestimmt werden, wie zum Beispiel , wo die Option A 453 126, können wir nacheinander in dieser Reihenfolge von Sequenz ausgeführt ableiten,

  • Das erste ist das erste Element 4, wir dieses Element verwenden, können „4“ Originalstapel in zwei, nämlich einem ersten Schritt, ist der linke der ursprüngliche Stapel wt, das Recht auf st_tmp, achten auf die Richtung der Öffnung st_tmp Gegenteil.
  • Dann wir zuerst bestimmen, ob der aktuelle traverse st die Oberseite des Stapelelement „4“ ist, wenn es um Pop-out ist, und durchqueren das nächste Element „5“ ist, als ein zweiter Schritt,
  • Im gleichen Arbeitsgang kamen wir zu dem dritten Schritt. Dieses Mal das Element „3“, diesmal auf der linken Seite oben auf dem Stapel bedeutet nicht st Element „3“ zu durchlaufen, so dass wir in der Reihenfolge von der Oberseite des Stapels von st_tmp st und schiebt nach links und dann herausspringen, ist dieser Schritt vereinfacht werden kann finden müssen direkt eingeblendet.
  • Bei dem vierten Schritt von „1“ durchlaufen, so finden wir, dass die linke Seite der Spitze des Stapels st kein Recht, die oben auf dem Stapel st_tmp nicht, ist zu diesem Zeitpunkt werden wir sukzessive schieben die Spitze des Stapels nach links, um st_tmp, bis die Spitze des Stapels finden gleich st_tmp an diesem Punkt Changierungselements „1“ so weit. Wenn zu diesem Zeitpunkt leider alle Elemente Pop-off st_tmp ist auch gefunden kein Element „1“ anzeigt, dass die Sequenz nicht die richtige Reihenfolge ist
  • Glücklicherweise war es immer noch Elemente „1“ und Pop-out, als sechster Schritt gefunden
  • Die nächsten Schritte sind ähnlich den Betrieb, wenn die letzten erfolgreiche Pop-out aller Elemente st und st_tmp, was darauf hinweist, dass die Sequenz korrekt ist, das heißt, kann die ursprüngliche Sequenz 654321 Stapel durch eine Reihe von Push / Pop Schritt erhalten werden.

Code-Implementierung

Code implementiert ist , wie folgt, in dem nicht nur 654321 die Bestimmung erkennen kann, 4321 auch andere Anzahl solcher Bestimmung zu erreichen, müssen nur zu ändern Variablen n, nicht nur die Anzahl, die das gleiche für jeden Stapel wie 343.453 gilt, etc., müssen nur die Initialisierung des Stapels ändern es kann sein.

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)

Nachsatz

Wenn Sie dieser Artikel hilfreich denken, willkommen Daumen + Sammlung einen stetigen Strom von Blogger mehr Leistung Text zur Verfügung zu stellen. Auch Willkommen Aufmerksamkeit auf die persönliche Zahl der öffentlichen, einen zweidimensionalen Code, wie folgt:
Alt

Veröffentlicht 95 Originalarbeiten · erntete Lob 30 · Ansichten 40000 +

Ich denke du magst

Origin blog.csdn.net/JohnJim0/article/details/105208210
Empfohlen
Rangfolge