Contents
Was ist Stapel?
Ein Stack ist eine Datenstruktur, die verwendet wird, um Daten in einer bestimmten Reihenfolge zu speichern. Zwei Operationen, die auf einem Stack ausgeführt werden können, umfassen eine Push-Operation, die ein Element in den Stack einfügt, und eine Pop-Operation, die das letzte Element entfernt, das in den Stack hinzugefügt wurde. Es folgt der Reihenfolge Last In First Out (LIFO). Jedes Mal, wenn ein Element hinzugefügt wird, wird es oben auf den Stapel gelegt und das einzige Element, das entfernt werden kann, ist das Element ganz oben im Stapel, genau wie ein Stapel von Objekten. Der Stapel befindet sich im Überlaufzustand, wenn er vollständig voll ist, und im Unterlaufzustand, wenn er vollständig leer ist.
Stack kann einfach mit einem Array oder einer Linked List implementiert werden. Arrays sind schnell, aber in der Größe begrenzt, und die verknüpfte Liste erfordert einen Overhead zum Zuordnen, Verknüpfen, Aufheben und Aufheben der Zuordnung, ist jedoch in der Größe nicht beschränkt.
Vorteile der Verwendung von Stack
- Stack bereinigt das Objekt automatisch.
- Es ermöglicht die Steuerung der Speicherzuweisung und -aufhebung.
- Es ist schwierig, die Größe der Variablen zu ändern.
- Ein Stack wird verwendet, wenn eine Variable außerhalb dieser Funktion nicht verwendet wird.
- Der Stapel ist nicht leicht zu beschädigen.
- Mit Stack ist es möglich, die Daten in der Methode Last in First out (LIFO) zu verwalten, was bei verknüpften Listen und Arrays nicht möglich ist.
Nachteile des Stapels
- Der Stack-Speicher ist sehr begrenzt.
- Normalerweise besteht die Gefahr eines Stapelüberlaufs, wenn zu viele Objekte auf dem Stapel erstellt werden.
- Random Access ist mit Stack normalerweise nicht möglich.
- Bei Stack können Fälle von abnormaler Beendigung auftreten, da Stack normalerweise außerhalb des Speicherbereichs liegt.
- Der Variablenspeicher wird überschrieben und dies kann zu undefiniertem Verhalten des Programms führen.
Anwendung des Stapels
- Parsing
- Ausdruckskonvertierung (Infix zu Postfix, Postfix zu Präfix usw.).
Was ist Haufen?
Heap ist ein Spezialfall einer ausgeglichenen binären Baumdatenstruktur, bei der der Wurzelknotenschlüssel mit seinen Kindern verglichen und entsprechend angeordnet wird. Ein Heap respektiert nämlich die Heap-Eigenschaft: Jeder Knoten muss niedriger sein als jeder seiner Kinder oder sein unterstes Element an seiner Wurzel, um leicht zugänglich zu sein .
Um einen binären Baum wie einen Heap darzustellen, besteht eine Implementierung darin, für jeden Knoten eine dynamische Zuordnung vorzunehmen, wobei 2 Zeiger auf seine Kinder zeigen. Ein Haufen kann auch durch die Darstellung in der Form einer realisiert werden Arrays , durch eine tun Ebene um Traversal des Haufens , wobei die Anordnung mit dem Element an der Wurzel beginnt, folgt dann mit den Kindern von dieser Wurzel, dann alle Kinder diese Kinder und dann die Urenkel und so weiter.
Vorteile der Verwendung von Heap
- Heap hat eine unbegrenzte Speichergröße.
- Es ermöglicht den globalen Zugriff auf Variablen.
- Heap-Methode, die auch in der proprietären Warteschlange verwendet wird.
- Heap hilft, die größte und minimale Anzahl zu finden.
- Um den vom Objekt verwendeten Speicher freizugeben, wird die Garbage Collection im Heap-Speicher ausgeführt.
Nachteile der Verwendung von Heap
- Es kann den maximalen Speicher bereitstellen, den ein Betriebssystem bereitstellen kann.
- Es dauert im Vergleich zum Stack viel Zeit in der Ausführung.
- Die Speicherverwaltung ist etwas komplex, da sie global verwendet wird.
Der Unterschied
- In Stapeln gespeicherte Variablen sind nur für den Thread des Besitzers sichtbar, während im Heap erstellte Objekte für alle Threads sichtbar sind. Einfach ausgedrückt ist Stack-Speicher eine Art privater Speicher von Java-Threads, während Heap-Speicher von allen Threads gemeinsam genutzt wird.
- Heap ist eine hierarchische Datenstruktur, während Stack eine lineare Datenstruktur ist.
- Heap kann unter Verwendung von Arrays und Bäumen implementiert werden, während ein Stack auf drei Arten implementiert werden kann: basierend auf verknüpften Listen, dynamischem Speicher oder einfach auf Arrays.
- Ein Heap ist flexibel und der zugewiesene Speicher kann geändert werden. Andererseits ist Stack nicht flexibel; die zugewiesene Speichergröße kann nicht geändert werden.
- Stack-Speicher wird verwendet, um lokale Variablen und Funktionsaufrufe zu speichern, während Heap-Speicher verwendet wird, um Objekte in Java zu speichern. Unabhängig davon, wo das Objekt im Code erstellt wird, beispielsweise als Membervariable, lokale Variable oder Klassenvariable, werden sie in Java immer innerhalb des Heapspace erstellt.
- Der Stack-Frame-Zugriff ist einfacher als der Heap-Frame, da der Stack einen kleinen Speicherbereich hat und Cache-freundlich ist, aber im Fall von Heap-Frames, die über den Speicher verteilt sind, führt dies zu mehr Cache-Fehlversuchen.
- In einem Stack erfolgt die Zuweisung und Aufhebung der Zuweisung durch die CPU, während im Heap die Zuweisung und Aufhebung der Zuweisung durch den Programmierer manuell erfolgen muss.
- Fast alle Baumoperationen können auf Heaps angewendet werden. Ein Element häufen, Minimum finden und Maximum finden. Auf der anderen Seite sind Push, Pop und Top die einzigen Operationen auf dem Stack.
- Im Heap gibt es keinen Überlauf und Unterlauf, während wir im Stack die Stack-Größe begrenzen können, so dass Stack-Überlauf- und Stack-Unterlauf-Bedingungen auftreten. Wenn wir ein Element aus dem leeren Stack herausnehmen möchten, wird diese Situation als Stack-Unterlauf bezeichnet. Auf der anderen Seite, wenn wir ein Element auf einen vollen Stack verschieben möchten (Stack-Elemente gleich der Stack-Größe), wird die Situation als Stack-Überlauf bezeichnet.
- Stack ist threadspezifisch, während Heap anwendungsspezifisch ist.
- Die Handhabung des Haufenrahmens ist kostspieliger als die Handhabung des Stapelrahmens.
Lesen Sie weiter: Verfahren vs. Objekt orientierte Programmierung
Stapel vs. Haufen in Tabellenform
VERGLEICHSGRUNDLAGE | STAPEL | HAUFEN |
Sichtbarkeit von Variablen/Objekten | In Stapeln gespeicherte Variablen sind nur für den Thread des Besitzers sichtbar. | Im Heap erstellte Objekte sind für alle Threads sichtbar. |
Strukturtyp | Stack ist eine lineare Datenstruktur. | Heap ist eine hierarchische Datenstruktur. |
Implementierung | Stack kann auf drei Arten implementiert werden: basierend auf verketteten Listen, dynamischem Speicher oder einfach auf Arrays. | Heap kann mithilfe von Arrays und Bäumen implementiert werden. |
Flexibilität | Stapel ist nicht flexibel; die zugewiesene Speichergröße kann nicht geändert werden. | Ein Heap ist flexibel und der zugewiesene Speicher kann geändert werden. |
Verwenden | Heap-Speicher wird verwendet, um Objekte in Java zu speichern. | Stapelspeicher wird verwendet, um lokale Variablen und Funktionsaufrufe zu speichern. |
Betreten | Der Stack-Frame-Zugriff ist einfacher als der Heap-Frame, da der Stack einen kleinen Speicherbereich hat und Cache-freundlich ist. | Der Zugriff auf Heap-Frames ist etwas schwieriger als auf den Stack-Frame, da Heap-Frames über den Speicher verteilt sind und daher mehr Cache-Fehltreffer verursachen. |
Zuweisung und Aufhebung | In einem Stack erfolgt die Zuweisung und Aufhebung der Zuweisung durch die CPU. | Im Heap muss die Zuweisung und Aufhebung der Zuweisung vom Programmierer manuell vorgenommen werden. |
Betrieb | Push, Pop und Top sind die einzigen Operationen auf dem Stack. | Fast alle Baumoperationen können auf Heaps angewendet werden. Ein Element häufen, Minimum finden und Maximum finden. |
Überlauf und Unterlauf | Im Stack können wir die Stack-Größe begrenzen, sodass Stack-Überlauf- und Stack-Unterlauf-Bedingungen auftreten. | Es gibt keinen Fall von Überlauf und Unterlauf im Heap. |
Besonderheit | Heap ist anwendungsspezifisch. | Stack ist threadspezifisch. |
Kosten | Die Handhabung des Stapelrahmens ist weniger kostspielig als die Handhabung des Haufenrahmens. | Die Handhabung des Haufenrahmens ist kostspieliger als die Handhabung des Stapelrahmens. |