Definieren eines Char Stacks in Java

1. Übersicht

In diesem Tutorial wird erläutert, wie Sie einen Zeichenstapel in Java erstellen . Wir werden zuerst sehen, wie wir dies mithilfe der Java-API tun können, und dann werden wir uns einige benutzerdefinierte Implementierungen ansehen.

Stack ist eine Datenstruktur, die dem LIFO-Prinzip (Last In First Out) folgt. Einige seiner gängigen Methoden sind:

  • push (E item) - schiebt einen Gegenstand an die Spitze des Stapels
  • pop () - Entfernt das Objekt oben im Stapel und gibt es zurück
  • peek () - Gibt das Objekt oben im Stapel zurück, ohne es zu entfernen

2. Char Stack mit Java API

Java verfügt über eine integrierte API namens java.util.Stack . Da char ein primitiver Datentyp ist , der in Generika nicht verwendet werden kann, müssen wir die Wrapper-Klasse von java.lang.Character verwenden , um einen Stack zu erstellen :

Stack charStack = new Stack();

Jetzt können wir die Push- , Pop- und Peek- Methoden mit unserem Stack verwenden .

Andererseits werden wir möglicherweise aufgefordert, eine benutzerdefinierte Implementierung eines Stapels zu erstellen. Daher werden wir uns mit verschiedenen Ansätzen befassen.

3. Benutzerdefinierte Implementierung mit LinkedList

Implementieren wir einen Char- Stack mit einer LinkedList als Back-End-Datenstruktur:

public class CharStack { private LinkedList items; public CharStack() { this.items = new LinkedList(); } }

Wir haben eine Elementvariable erstellt , die im Konstruktor initialisiert wird.

Jetzt müssen wir eine Implementierung der Push- , Peek- und Pop- Methoden bereitstellen :

public void push(Character item) { items.push(item); } public Character peek() { return items.getFirst(); } public Character pop() { Iterator iter = items.iterator(); Character item = iter.next(); if (item != null) { iter.remove(); return item; } return null; }

Die Push- und Peek- Methoden verwenden die integrierten Methoden einer LinkedList . Für Pop haben wir zuerst einen Iterator verwendet , um zu überprüfen, ob sich oben ein Element befindet oder nicht. Wenn es dort ist, entfernen wir das Element aus der Liste, indem wir die Methode remove aufrufen .

4. Benutzerdefinierte Implementierung mithilfe eines Arrays

Wir können auch ein Array für unsere Datenstruktur verwenden:

public class CharStackWithArray { private char[] elements; private int size; public CharStackWithArray() { size = 0; elements = new char[4]; } }

Oben, wir schaffen char - Array, das wir mit einer Anfangskapazität von 4 Zusätzlich im Konstruktor initialisieren, haben wir eine Größe variabel , um zu verfolgen , wie viele Datensätze vorhanden sind , in unserem Stapel.

Implementieren wir nun die Push- Methode:

public void push(char item) { ensureCapacity(size + 1); elements[size] = item; size++; } private void ensureCapacity(int newSize) { char newBiggerArray[]; if (elements.length < newSize) { newBiggerArray = new char[elements.length * 2]; System.arraycopy(elements, 0, newBiggerArray, 0, size); elements = newBiggerArray; } }

Während wir ein Element auf den Stapel schieben, müssen wir zuerst prüfen, ob unser Array die Kapazität hat, es zu speichern. Wenn nicht, erstellen wir ein neues Array und verdoppeln seine Größe. Wir kopieren Sie dann die alten Elemente in das neu erstellte Array und weisen Sie auf unsere Elemente variabel.

Hinweis: Eine Erklärung, warum wir die Größe des Arrays verdoppeln möchten, anstatt nur die Größe um eins zu erhöhen, finden Sie in diesem StackOverflow-Beitrag.

Lassen Sie uns abschließend die Peek- und Pop- Methoden implementieren :

public char peek() { if (size == 0) { throw new EmptyStackException(); } return elements[size - 1]; } public char pop() { if (size == 0) { throw new EmptyStackException(); } return elements[--size]; }

Bei beiden Methoden nach dem Validieren , dass der Stapel nicht leer ist, wir das Element an der Position zurückzukehren Größe - 1. Für Pop , zusätzlich zu dem Element zurückkehrt, dekrementieren wir die Größe von 1.

5. Schlussfolgerung

In diesem Artikel haben wir gelernt, wie ein Char- Stack mithilfe der Java-API erstellt wird, und wir haben einige benutzerdefinierte Implementierungen gesehen.

Der in diesem Artikel vorgestellte Code ist auf GitHub verfügbar.