


Mehrere Möglichkeiten zur Implementierung von Stacks in Python und ihre Vor- und Nachteile
Um mehr über Open Source zu erfahren, besuchen Sie bitte:
51CTO Open Source Basic Software Community
1. Das Konzept des Stapels
Ein Stapel ist eine durch eine Reihe von Objekten organisierte Sammlung. Die Hinzufügungs- und Löschvorgänge dieser Objekte folgen einem „Last In First Out“ (LIFO)-Prinzip.
Es kann immer nur ein Objekt in den Stapel eingefügt werden, das Erfassen oder Löschen kann jedoch nur an der Spitze des Stapels erfolgen. Beispielsweise ist in einem Stapel aus Büchern nur das Buch oben sichtbar, dessen Einband frei liegt. Um an andere Bücher zu gelangen, kann nur das oberste Buch entfernt werden, wie im Bild gezeigt:
Praktische Anwendung des Stacks
Viele Anwendungen im Internet nutzen Stacks, wie zum Beispiel:
- Webbrowser speichern kürzlich besuchte URLs in einem Stack. Immer wenn ein Benutzer eine neue Website besucht, wird die URL der neuen Website an die Spitze des Stapels verschoben. Auf diese Weise kann jedes Mal, wenn wir im Browser auf die Schaltfläche „Zurück“ klicken (oder die Tastenkombination STRG+Z drücken, die meisten Rückgängig-Tastenkombinationen), die zuletzt besuchte URL angezeigt werden, um zur zuvor besuchten Suche zurückzukehren. Zustand.
- Texteditoren bieten oft einen „Rückgängig“-Mechanismus, um den letzten Bearbeitungsvorgang abzubrechen und zum vorherigen Zustand zurückzukehren. Dieser Rückgängig-Vorgang wird auch dadurch erreicht, dass der geänderte Status des Texts in einem Stapel gespeichert wird.
- Speicherverwaltung einiger Hochsprachen, JVM-Stack, Python-Stack werden auch für die Speicherverwaltung, Laufzeitumgebung verschachtelter Sprachfunktionen usw. verwendet.
- Backtracking (Spiele spielen, Pfade finden, umfassende Suche)
- Wird in Algorithmen verwendet B. der Turm von Hanoi, Baumdurchquerung, Histogrammprobleme und auch in Diagrammalgorithmen wie der topologischen Sortierung verwendet
- Syntaxverarbeitung:
- Der Platz für Parameter und lokale Variablen wird intern mithilfe eines Stapels erstellt.
- Die Syntaxprüfung des Compilers für den Klammerabgleich
- Unterstützung für Rekursion
- Ausdrücke wie Suffixe oder Präfixe im Compiler
2. Der abstrakte Datentyp des Stapels
Jede Datenstruktur ist untrennbar miteinander verbunden. So speichern und erhalten Sie Daten. Wie oben erwähnt, ist ein Stapel eine geordnete Sammlung von Elementen, die alle an der Spitze des Stapels (oben im Stapel) erfolgen. Dann umfassen seine abstrakten Datentypen:
- Stack(): Erstellt ein leerer Stapel, benötigt keine Parameter und gibt einen leeren Stapel zurück.
- push(e): Fügt ein Element e oben im Stapel S hinzu. Es erfordert einen Parameter e und hat keinen Rückgabewert.
- pop(): Entfernen Sie das Element oben im Stapel. Es sind keine Parameter erforderlich, es wird jedoch das oberste Element zurückgegeben und der Inhalt des Stapels geändert.
- top(): Gibt das Element oben im Stapel zurück, entfernt jedoch nicht das Element oben im Stapel. Wenn der Stapel leer ist, wird dieser Vorgang ausgeführt.
- is_empty(): Wenn der Stapel keine Elemente enthält, wird der boolesche Wert „True“ zurückgegeben.
- size(): Gibt die Daten der Elemente im Stapel zurück. Es erfordert keine Parameter und gibt eine Ganzzahl zurück. In Python kann dies mit der speziellen Methode __len__ erreicht werden.
Die Größe des Python-Stacks ist möglicherweise festgelegt, oder es gibt eine dynamische Implementierung, die eine Änderung der Größe zulässt. Bei einem Stapel fester Größe führt der Versuch, einem bereits vollen Stapel ein Element hinzuzufügen, zu einer Stapelüberlaufausnahme. Ebenso führt der Versuch, ein Element aus einem bereits leeren Stapel zu entfernen, zu pop()
Diese Situation wird als Unterlauf bezeichnet. pop()
操作这种情况被称为下溢。
三、用 Python 的列表实现栈
在学习 Python 的时候,一定学过 Python 列表 list
- Wenn Sie Python lernen, müssen Sie Python-Listen gelernt haben
list
, es kann die Stapelfunktion durch einige integrierte Methoden realisieren: - Verwenden Sie die Append-Methode, um a hinzuzufügen Elemente am Ende der Liste hinzufügen, kann diese Methode die push()-Operation simulieren.
- Die Methode pop() wird zum Simulieren von Pop-Operationen verwendet.
- Simulieren Sie die top()-Operation über L[-1].
- Simulieren Sie die Operation isEmpty(), indem Sie len(L)==0 beurteilen.
Implementieren Sie die Funktion size() über die Funktion len().
class ArrayStack: """ 通过 Python 列表实现 LIFO 栈""" def __init__(self): self._data = [] def size(self): """ return the number of elements in the stack""" return len(self._data) def is_empty(self): """ return True if the stack is empty""" return len(self._data) == 0 def push(self, e): """ add element e to the top of the stack""" self._data.append(e) def pop(self): """ remove and return the element from the top of the stack """ if self.is_empty(): raise Exception('Stack is empty') return self._data.pop() def top(self): """return the top of the stack Raise Empty exception if the stack is empty """ if self.is_empty(): raise Exception('Stack is empty') return self._data[-1]# the last item in the list arrayStack = ArrayStack() arrayStack.push("Python") arrayStack.push("Learning") arrayStack.push("Hello") print("Stack top element: ", arrayStack.top()) print("Stack length: ", arrayStack.size()) print("Stack popped item: %s" % arrayStack.pop()) print("Stack is empty?", arrayStack.is_empty()) arrayStack.pop() arrayStack.pop() print("Stack is empty?", arrayStack.is_empty()) # arrayStack.pop()
Führen Sie dieses Programm aus. Das Ergebnis ist:
Stack top element:Hello Stack length:3 Stack popped item: Hello Stack is empty? False Stack is empty? True
Sie können nicht nur das Ende der Liste als obersten Punkt des Stapels verwenden, sondern auch den Kopf der Liste als obersten Punkt des Stapels. Allerdings können Sie in diesem Fall die Methoden pop() und append() nicht direkt verwenden, sondern über die Methoden pop() und insert() explizit auf das Element mit Index 0 zugreifen, das das erste Element der Liste ist . Der Code lautet wie folgt:
rrreeObwohl wir die Implementierung des abstrakten Datentyps geändert haben, haben wir seine logischen Eigenschaften beibehalten. Diese Fähigkeit verkörpert abstrakte Ideen. Obwohl beide Methoden Stapel implementieren, unterscheiden sich ihre Leistungsmethoden: Die zeitliche Komplexität der Methoden
- append() und pop() sind beide *O(1), *Operationen auf konstanter Ebene
- Die Leistung der zweiten Die Implementierung ist durch die Anzahl der Elemente im Stapel begrenzt. Dies liegt daran, dass die Zeitkomplexität von insert(0) und pop(0) O(n) ist und es umso langsamer ist, je mehr Elemente vorhanden sind.
4. Verwenden Siecollections.deque, um den Stack zu implementieren.
In Python verfügt das Collections-Modul über eine doppelendige Warteschlangendatenstruktur. Diese Datenstruktur implementiert auch die Methoden append() und pop():
class ArrayStack: """ 通过 Python 列表实现 LIFO 栈""" def __init__(self): self._data = [] def size(self): """ return the number of elements in the stack""" return len(self._data) def is_empty(self): """ return True if the stack is empty""" return len(self._data) == 0 def push(self, e): """ add element e to the top of the stack""" self._data.insert(0, e) def pop(self): """ remove and return the element from the top of the stack """ if self.is_empty(): raise Exception('Stack is empty') return self._data.pop(0) def top(self): """return the top of the stack Raise Empty exception if the stack is empty """ if self.is_empty(): raise Exception('Stack is empty') return self._data[0]# the last item in the list
Warum braucht List immer noch Deque?
Vielleicht können Sie sehen, dass Deque und Liste auf die gleiche Weise auf Elemente einwirken. Warum fügt Python Listen eine Deque-Datenstruktur hinzu?
Das liegt daran, dass Listen in Python in zusammenhängenden Speicherblöcken aufgebaut sind, was bedeutet, dass die Elemente der Liste direkt nebeneinander gespeichert werden.
Dies funktioniert hervorragend für einige Vorgänge, wie zum Beispiel das Indizieren einer Liste. Das Abrufen von myList[3] geht schnell, da Python genau weiß, wo es im Speicher suchen muss. Dieses Speicherlayout ermöglicht auch eine gute Slicing-Funktion bei Listen.
Beim zusammenhängenden Speicherlayout der Liste kann es länger dauern, bis .append() einige Objekte enthält. Wenn der fortlaufende Speicherblock voll ist, muss zuerst ein weiterer Speicherblock abgerufen und der gesamte Speicherblock kopiert werden. Diese Aktion kann länger dauern als der normale .append()-Vorgang.
Die doppelendige Warteschlangen-Deque basiert auf einer doppelt verknüpften Liste. In einer verknüpften Listenstruktur wird jeder Eintrag in einem eigenen Speicherblock gespeichert und verfügt über einen Verweis auf den nächsten Eintrag in der Liste.
Das Gleiche gilt für eine doppelt verknüpfte Liste, mit der Ausnahme, dass jeder Eintrag einen Verweis auf den vorherigen und nächsten Eintrag in der Liste hat. Dies erleichtert das Hinzufügen von Knoten an beiden Enden der Liste.
Um einen neuen Eintrag in einer verknüpften Listenstruktur hinzuzufügen, legen Sie einfach die Referenz des neuen Eintrags so fest, dass sie auf die Oberseite des aktuellen Stapels zeigt, und zeigen Sie dann mit der Oberseite des Stapels auf den neuen Eintrag.
Diese Zeit des ständigen Hinzufügens und Entfernens von Einträgen auf dem Stapel ist jedoch mit Kosten verbunden. Das Abrufen von myDeque[3] ist langsamer als das Abrufen einer Liste, da Python jeden Knoten der Liste durchlaufen muss, um das dritte Element abzurufen.
Glücklicherweise möchten Sie selten Elemente auf dem Stapel zufällig indizieren oder Listen-Slicing-Vorgänge durchführen. Die meisten Operationen auf dem Stapel sind Push oder Pop.
Wenn Ihr Code keine Threads verwendet, machen die zeitkonstanten .append()- und .pop()-Operationen deque zu einer besseren Wahl für die Implementierung des Python-Stacks.
5. Verwenden Sie queue.LifoQueue, um den Stack zu implementieren. Python-Stack ist auch in Multithread-Programmen sehr nützlich. Wir haben bereits die beiden Methoden list und deque gelernt. Für jede Datenstruktur, auf die mehrere Threads zugreifen können, sollten wir in der Multithread-Programmierung keine Liste verwenden, da Listen nicht threadsicher sind. Die Methoden .append() und .pop() von deque sind atomar, was bedeutet, dass sie nicht von verschiedenen Threads gestört werden.
Während die Verwendung von deque einen threadsicheren Python-Stack erstellen kann, sind Sie dadurch anfällig für künftigen Missbrauch und schaffen Rennbedingungen.
Okay, wenn Sie Multithread-Programmierung betreiben, können Sie list nicht als Stapel verwenden, und Sie möchten wahrscheinlich auch nicht deque als Stapel verwenden. Wie erstellt man also einen Python-Stack für ein Thread-Programm?
Die Antwort liegt im Warteschlangenmodul: queue.LifoQueue. Erinnern Sie sich, wie Sie erfahren haben, dass der Stack nach dem Last-In-First-Out-Prinzip (LIFO) arbeitet? Nun, genau das repräsentiert der „Lifo“-Teil von LifoQueue.
Obwohl die Schnittstellen von list und deque ähnlich sind, verwendet LifoQueue .put() und .get(), um Daten zum Stapel hinzuzufügen und daraus zu entfernen.
>>> from queue import LifoQueue >>> stack = LifoQueue() >>> stack.put('H') >>> stack.put('E') >>> stack.put('L') >>> stack.put('L') >>> stack.put('O') >>> stack <queue.LifoQueue object at 0x00000123159F7310> >>> >>> stack.get() 'O' >>> stack.get() 'L' >>> stack.empty() False >>> stack.qsize() 3 >>> stack.get() 'L' >>> stack.get() 'E' >>> stack.qsize() 1 >>> stack.get() 'H' >>> stack.get_nowait() Traceback (most recent call last): File "<pyshell#31>", line 1, in <module> stack.get_nowait() _queue.Empty >>> >>> stack.put('Apple') >>> stack.get_nowait() 'Apple'
与 deque 不同,LifoQueue 被设计为完全线程安全的。它的所有方法都可以在线程环境中安全使用。它还为其操作添加了可选的超时功能,这在线程程序中经常是一个必须的功能。
然而,这种完全的线程安全是有代价的。为了实现这种线程安全,LifoQueue 必须在每个操作上做一些额外的工作,这意味着它将花费更长的时间。
通常情况下,这种轻微的减速对你的整体程序速度并不重要,但如果你已经测量了你的性能,并发现你的堆栈操作是瓶颈,那么小心地切换到 deque 可能是值得做的。
六、选择哪一种实现作为栈
一般来说,如果你不使用多线程,你应该使用 deque。如果你使用多线程,那么你应该使用 LifoQueue,除非你已经测量了你的性能,发现 push 和 pop 的速度的小幅提升会带来足够的差异,以保证维护风险。
你可以对列表可能很熟悉,但需要谨慎使用它,因为它有可能存在内存重新分配的问题。deque 和 list 的接口是相同的,而且 deque 没有线程不安全问题。
七、总结
本文介绍了栈这一数据结构,并介绍了在现实生活中的程序中如何使用它的情况。在文章的中,介绍了 Python 中实现栈的三种不同方式,知道了 deque 对于非多线程程序是一个更好的选择,如果你要在多线程编程环境中使用栈的话,可以使用 LifoQueue。
Das obige ist der detaillierte Inhalt vonMehrere Möglichkeiten zur Implementierung von Stacks in Python und ihre Vor- und Nachteile. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Ist es genug, um Python für zwei Stunden am Tag zu lernen? Es hängt von Ihren Zielen und Lernmethoden ab. 1) Entwickeln Sie einen klaren Lernplan, 2) Wählen Sie geeignete Lernressourcen und -methoden aus, 3) praktizieren und prüfen und konsolidieren Sie praktische Praxis und Überprüfung und konsolidieren Sie und Sie können die Grundkenntnisse und die erweiterten Funktionen von Python während dieser Zeit nach und nach beherrschen.

Zu den wichtigsten Anwendungen von Python in der Webentwicklung gehören die Verwendung von Django- und Flask -Frameworks, API -Entwicklung, Datenanalyse und Visualisierung, maschinelles Lernen und KI sowie Leistungsoptimierung. 1. Django und Flask Framework: Django eignet sich für die schnelle Entwicklung komplexer Anwendungen, und Flask eignet sich für kleine oder hochmobile Projekte. 2. API -Entwicklung: Verwenden Sie Flask oder Djangorestframework, um RESTFUFFUPI zu erstellen. 3. Datenanalyse und Visualisierung: Verwenden Sie Python, um Daten zu verarbeiten und über die Webschnittstelle anzuzeigen. 4. Maschinelles Lernen und KI: Python wird verwendet, um intelligente Webanwendungen zu erstellen. 5. Leistungsoptimierung: optimiert durch asynchrones Programmieren, Caching und Code

Python ist in der Entwicklungseffizienz besser als C, aber C ist in der Ausführungsleistung höher. 1. Pythons prägnante Syntax und reiche Bibliotheken verbessern die Entwicklungseffizienz. 2. Die Kompilierungsmerkmale von Compilation und die Hardwarekontrolle verbessern die Ausführungsleistung. Bei einer Auswahl müssen Sie die Entwicklungsgeschwindigkeit und die Ausführungseffizienz basierend auf den Projektanforderungen abwägen.

Zu den realen Anwendungen von Python gehören Datenanalysen, Webentwicklung, künstliche Intelligenz und Automatisierung. 1) In der Datenanalyse verwendet Python Pandas und Matplotlib, um Daten zu verarbeiten und zu visualisieren. 2) In der Webentwicklung vereinfachen Django und Flask Frameworks die Erstellung von Webanwendungen. 3) Auf dem Gebiet der künstlichen Intelligenz werden Tensorflow und Pytorch verwendet, um Modelle zu bauen und zu trainieren. 4) In Bezug auf die Automatisierung können Python -Skripte für Aufgaben wie das Kopieren von Dateien verwendet werden.

Python wird häufig in den Bereichen Data Science, Web Development und Automation Scripting verwendet. 1) In der Datenwissenschaft vereinfacht Python die Datenverarbeitung und -analyse durch Bibliotheken wie Numpy und Pandas. 2) In der Webentwicklung ermöglichen die Django- und Flask -Frameworks Entwicklern, Anwendungen schnell zu erstellen. 3) In automatisierten Skripten machen Pythons Einfachheit und Standardbibliothek es ideal.

Die Flexibilität von Python spiegelt sich in Multi-Paradigm-Unterstützung und dynamischen Typsystemen wider, während eine einfache Syntax und eine reichhaltige Standardbibliothek stammt. 1. Flexibilität: Unterstützt objektorientierte, funktionale und prozedurale Programmierung und dynamische Typsysteme verbessern die Entwicklungseffizienz. 2. Benutzerfreundlichkeit: Die Grammatik liegt nahe an der natürlichen Sprache, die Standardbibliothek deckt eine breite Palette von Funktionen ab und vereinfacht den Entwicklungsprozess.

Python ist für seine Einfachheit und Kraft sehr beliebt, geeignet für alle Anforderungen von Anfängern bis hin zu fortgeschrittenen Entwicklern. Seine Vielseitigkeit spiegelt sich in: 1) leicht zu erlernen und benutzten, einfachen Syntax; 2) Reiche Bibliotheken und Frameworks wie Numpy, Pandas usw.; 3) plattformübergreifende Unterstützung, die auf einer Vielzahl von Betriebssystemen betrieben werden kann; 4) Geeignet für Skript- und Automatisierungsaufgaben zur Verbesserung der Arbeitseffizienz.

Ja, lernen Sie Python in zwei Stunden am Tag. 1. Entwickeln Sie einen angemessenen Studienplan, 2. Wählen Sie die richtigen Lernressourcen aus, 3. Konsolidieren Sie das durch die Praxis erlernte Wissen. Diese Schritte können Ihnen helfen, Python in kurzer Zeit zu meistern.


Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

AI Hentai Generator
Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

Heiße Werkzeuge

MinGW – Minimalistisches GNU für Windows
Dieses Projekt wird derzeit auf osdn.net/projects/mingw migriert. Sie können uns dort weiterhin folgen. MinGW: Eine native Windows-Portierung der GNU Compiler Collection (GCC), frei verteilbare Importbibliotheken und Header-Dateien zum Erstellen nativer Windows-Anwendungen, einschließlich Erweiterungen der MSVC-Laufzeit zur Unterstützung der C99-Funktionalität. Die gesamte MinGW-Software kann auf 64-Bit-Windows-Plattformen ausgeführt werden.

DVWA
Damn Vulnerable Web App (DVWA) ist eine PHP/MySQL-Webanwendung, die sehr anfällig ist. Seine Hauptziele bestehen darin, Sicherheitsexperten dabei zu helfen, ihre Fähigkeiten und Tools in einem rechtlichen Umfeld zu testen, Webentwicklern dabei zu helfen, den Prozess der Sicherung von Webanwendungen besser zu verstehen, und Lehrern/Schülern dabei zu helfen, in einer Unterrichtsumgebung Webanwendungen zu lehren/lernen Sicherheit. Das Ziel von DVWA besteht darin, einige der häufigsten Web-Schwachstellen über eine einfache und unkomplizierte Benutzeroberfläche mit unterschiedlichen Schwierigkeitsgraden zu üben. Bitte beachten Sie, dass diese Software

SecLists
SecLists ist der ultimative Begleiter für Sicherheitstester. Dabei handelt es sich um eine Sammlung verschiedener Arten von Listen, die häufig bei Sicherheitsbewertungen verwendet werden, an einem Ort. SecLists trägt dazu bei, Sicherheitstests effizienter und produktiver zu gestalten, indem es bequem alle Listen bereitstellt, die ein Sicherheitstester benötigen könnte. Zu den Listentypen gehören Benutzernamen, Passwörter, URLs, Fuzzing-Payloads, Muster für vertrauliche Daten, Web-Shells und mehr. Der Tester kann dieses Repository einfach auf einen neuen Testcomputer übertragen und hat dann Zugriff auf alle Arten von Listen, die er benötigt.

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor