Implementieren Sie so etwas wie einen Stack in Java

Einführung

Aus irgendeinem Grund habe ich mich plötzlich entschlossen, ein stapelähnliches Programm für diejenigen zu erstellen und zu erklären, die angefangen haben, Java zu lernen. Aus zeitlichen Gründen konnte ich es jedoch überhaupt nicht erklären, daher werde ich die Erklärung in diesem Artikel als Ergänzung und Qiita-Mission fortsetzen.

Die Zielgruppe sind diejenigen, die neu in Java sind. Um genauer zu sein, gehe ich davon aus, dass ich die Grundlagen von Datentypen und Arrays durch Hello World gelernt habe und kurz nachdem ich gelernt habe, wie if-Anweisungen, for-Anweisungen und while-Anweisungen zu schreiben.

Ich denke jedoch, dass es schwierig ist, einen Stapel plötzlich zu implementieren (so etwas), daher werden wir in Kapitel 1 nur das minimale Framework erstellen und in Kapitel 2 und später werden wir die als Stapel erforderlichen Funktionen nacheinander hinzufügen. Wir werden es zusätzlich implementieren. Wenn Sie also in der Reihenfolge ab Kapitel 1 codieren, sollten Sie in der Lage sein, einen Stapel (so etwas) ohne große Verwirrung zu erstellen.

Als Entwicklungsumgebung wird paiza.io verwendet. Wie der Titel schon sagt, ist die Sprache Java.

Dann bleib bitte eine Weile bei mir.

Kapitel 0 Über Stack

Ein Stapel ist eine der Datenstrukturen und verfügt über einen Mechanismus (LIFO: Last In First Out), um den letzten zu löschen. Stellen Sie sich einen Aufzug vor. Wenn Sie die Manieren der Werktätigen nicht berücksichtigen, beginnen Sie beim Einsteigen in den Aufzug von hinten. Und wenn Sie aus dem Aufzug steigen, steigen Sie von der Person in der Nähe der Tür aus, dh der Person, die zuletzt eingestiegen ist.

In diesem Artikel erstellen wir ein stapelähnliches Programm, das die Eingabe-Ganzzahlen in ein Array schiebt (speichert), das die Rolle eines Stapels hat, und in der Reihenfolge der letzten Eingabe-Ganzzahl Pops (Ausgaben). Das ultimative Ziel ist es, die folgenden Anforderungen zu erfüllen:

Lassen Sie es uns nach und nach aus Kapitel 1 implementieren.

Kapitel 1 Eingabeverarbeitung

Beginnen wir in diesem Kapitel mit den folgenden relativ einfachen Elementen.

Gehen Sie zu paiza.io und klicken Sie auf "Code-Erstellung versuchen (kostenlos)". Zuerst sehen Sie möglicherweise Beispiele aus anderen Sprachen wie PHP, aber in diesem Fall wählen Sie Java. Sie sollten ein einfaches Programm sehen, das die println-Methode wie folgt enthält:

import java.util.*;

public class Main {
    public static void main(String[] args) throws Exception {
        // Your code here!
        
        System.out.println("XXXXXXXX");
    }
}

Um die Eingabe von Zeichenfolgen und Ganzzahlen zu akzeptieren, erhalten wir sie einmal als Zeichenfolgentyp und konvertieren sie nur dann in einen Int-Typ, wenn sie als Ganzzahl behandelt wird. Versuchen Sie nun, ein Programm zu schreiben, das die eingegebene Zeichenfolge vorerst im Typ String speichert. Fügen Sie außerdem einen Prozess hinzu, um "Ihre Eingabe ist [Eingabezeichenfolge]" anzuzeigen, um zu überprüfen, ob die Eingabe bei der Ausführung korrekt akzeptiert wird. Wenn Sie es schreiben können, überprüfen wir das Antwortbeispiel 1-1 unten.

Antwortbeispiel 1-1 (Zum Öffnen klicken)
import java.util.*;

public class Main {
    public static void main(String[] args) throws Exception {
        Scanner sc = new Scanner(System.in);
        while (true) {
            String input = sc.nextLine();
            System.out.println("Your input is [" + input + "]");
        }
    }
}

Probieren wir es aus. In paiza.io müssen Sie anstelle der Eingabe über die Eingabeaufforderung die Registerkarte Eingabe auswählen und alles, was Sie eingeben möchten, in das angezeigte Fenster schreiben. Wenn Sie also auf die Registerkarte Eingabe klicken, schreiben Sie wie folgt.

push 1
push 2
push 3
end

Sobald Sie dies getan haben, ist es Zeit, es wirklich zu tun. Dadurch wird eine Registerkarte mit dem Namen "Laufzeitfehler" mit der Meldung "Keine Zeile gefunden" erstellt. Der Grund dafür ist, dass die Bedingung für die Wiederholung der while-Anweisung wahr ist, sodass der Prozess für immer wiederholt werden muss. Obwohl ich die Eingabe bis zum Ende akzeptiert habe, habe ich versucht, mehr Eingabe zu erhalten, daher wurde mir "Nicht mehr" gesagt. Wenn Sie auf die Registerkarte "Ausgabe" klicken, können Sie feststellen, dass diese bis zum "Ende" ordnungsgemäß akzeptiert wird.

Betrachten wir nun die folgenden Punkte.

Um festzustellen, ob die eingegebene Zeichenfolge gleich "end" ist, können Sie die vom String-Klassenobjekt bereitgestellte Methode equals verwenden. Bitte überprüfen Sie die detaillierte Verwendung selbst und schreiben Sie einen Prozess, um aus der Schleife der while-Anweisung herauszukommen, wenn "end" eingegeben wird. Wenn Sie es schreiben können, überprüfen wir das Antwortbeispiel 1-2 unten.

Antwortbeispiel 1-2 (Zum Öffnen klicken)
import java.util.*;

public class Main {
    public static void main(String[] args) throws Exception {
        Scanner sc = new Scanner(System.in);
        while (true) {
            String input = sc.nextLine();
            System.out.println("Your input is [" + input + "]");
            if (input.equals("end")) {
                break;
            }
        }
    }
}

Versuch es bitte. Nachdem ich "end" akzeptiert hatte, verließ ich die Schleife der while-Anweisung und das Programm konnte normal enden, sodass kein Laufzeitfehler auftritt. Der Eingabevorgang ist jetzt OK.

Kapitel 2 Push-Verarbeitung

In diesem Kapitel implementieren Sie Folgendes:

Bereiten wir ein Array vom Typ int vor, das als Stapel fungiert. Der Name des Arrays sollte Stapel sein. Wenn Sie ein Array deklarieren, schreiben Sie 5 nicht direkt, um die Anzahl der Elemente anzugeben. Weisen Sie stattdessen der Variablen vom Typ int im Voraus 5 zu und verwenden Sie N, wenn Sie das Array deklarieren. Diese werden vor der while-Anweisung geschrieben.

Als nächstes überlegen wir uns, wie die Eingabe von "Push Integer" behandelt wird. Da die eingegebene Zeichenfolge Push, Leerzeichen halber Breite und Ganzzahl ist, können Sie zunächst beurteilen, dass es sich um einen Push-Befehl handelt, indem Sie nur die ersten 4 Zeichen betrachten. Verwenden Sie dazu die von der String-Klasse bereitgestellte Teilzeichenfolgenmethode.

Da nur Ganzzahlen aus der Eingabezeichenfolge extrahiert werden, verwenden wir auch die in der String-Klasse bereitgestellte Split-Methode, um sie in Push- und Ganzzahlen zu unterteilen. Da die Ganzzahl jedoch nur durch Teilen als Zeichenfolge behandelt wird, konvertieren Sie die Zeichenfolge mit der parseInt-Methode der Integer-Klasse in den Typ int. Verwenden Sie die parseInt-Methode wie folgt.

int number = Integer.parseInt(string);

Betrachten wir abschließend den Prozess zum Bestimmen der Nummer des Array-Stapels beim Übertragen einer Ganzzahl. Sie könnten denken, dass das Array sowohl vorne als auch hinten hat, aber hier entscheiden wir, dass das 0. Element die Vorderseite und das N $ - $ 1 ($ = $ 4) -te Element die Rückseite ist. .. Das heißt, die ganzen Zahlen werden vom N $ - $ 1 im Hintergrund bis zum 0 im Vordergrund gespeichert. Wenn die Ganzzahl jedoch bereits bis zum 0. gespeichert ist, muss eine Fehlermeldung ausgegeben werden. Schreiben Sie sie daher mit Vorsicht. Wenn Sie es schreiben können, überprüfen wir das Antwortbeispiel 2 unten.

Beantworten Sie Beispiel 2 (zum Öffnen klicken)
import java.util.*;

public class Main {
    public static void main(String[] args) throws Exception {
        Scanner sc = new Scanner(System.in);
        int N = 5;
        int[] stack = new int[N];
        int indexPointer = N;
        
        while (true) {
            String input = sc.nextLine();
            System.out.println("Your input is [" + input + "]");
            if (input.equals("end")) {
                break;
            } else if (input.substring(0, 4).equals("push")) {
                if (indexPointer >= 1 && indexPointer <= N) {
                    String[] commands = input.split(" ");
                    int number = Integer.parseInt(commands[1]);
                    indexPointer --;
                    stack[indexPointer] = number;
                    System.out.println(number + " pushed. index:" + indexPointer);
                } else {
                    System.out.println("push error.");
                }
            }
        }
    }
}

Ich werde ein wenig ergänzen. Wir haben einen neuen Indexindex vom Typ int vorbereitet, um zu wissen, in welchem Element des Arrays die Ganzzahl gespeichert ist. Bei der Push-Verarbeitung wird bestimmt, ob eine Ganzzahl vor dem Element gespeichert werden kann, das unmittelbar zuvor angezeigt wurde, dh ob der Indexzeiger __now__1 oder mehr und N oder weniger ist. Wenn dies der Fall ist, dekrementieren Sie den Indexzeiger um 1 und speichern Sie die Ganzzahl anstelle dieses Werts. Für diesen Prozess muss der Anfangswert beim Deklarieren von indexPointer N sein.

Lassen Sie uns nun ein wenig testen, um festzustellen, ob der bisherige Prozess korrekt ist. Wählen Sie die Registerkarte Eingabe und schreiben Sie wie folgt.

push 1
push 2
push 3
push 4
push 5
push 6
end

Ich werde es versuchen.

Your input is [push 1]
1 pushed. index:4
Your input is [push 2]
2 pushed. index:3
Your input is [push 3]
3 pushed. index:2
Your input is [push 4]
4 pushed. index:1
Your input is [push 5]
5 pushed. index:0
Your input is [push 6]
push error.
Your input is [end]

Die Ganzzahlen werden in der Reihenfolge von der Rückseite des Arrays gespeichert, und nach dem Speichern von 5 von ihnen wird eine Fehlermeldung angezeigt.

Kapitel 3 Pop-Verarbeitung

Wenn Sie es bis hierher geschafft haben, ist der Stapel fast vollständig. Im vorherigen Kapitel haben wir uns entschieden, die Variable indexPointer zu verwenden, um zu wissen, welches Element des Arrays derzeit gespeichert ist. Diese Variable kann so wie sie ist für die Pop-Verarbeitung verwendet werden. Wenn Sie es schreiben können, überprüfen wir das Antwortbeispiel 3 unten.

Beantworten Sie Beispiel 3 (zum Öffnen klicken)
import java.util.*;

public class Main {
    public static void main(String[] args) throws Exception {
        Scanner sc = new Scanner(System.in);
        int N = 5;
        int[] stack = new int[N];
        int indexPointer = N;
        
        while (true) {
            String input = sc.nextLine();
            System.out.println("Your input is [" + input + "]");
            if (input.equals("end")) {
                break;
            } else if (input.length() >= 4 && input.substring(0, 4).equals("push")) {
                if (indexPointer >= 1 && indexPointer <= N) {
                    String[] commands = input.split(" ");
                    int number = Integer.parseInt(commands[1]);
                    indexPointer --;
                    stack[indexPointer] = number;
                    System.out.println(number + " pushed. index:" + indexPointer);
                } else {
                    System.out.println("push error.");
                }
            } else if (input.equals("pop")) {
                if (indexPointer >= 0 && indexPointer < N) {
                    System.out.println(stack[indexPointer] + " poped. index:" + indexPointer);
                    indexPointer ++;
                } else {
                    System.out.println("pop error.");
                }
            }
        }
    }
}

Was denken Sie. Ich denke, es war ein bisschen einfacher als der Push-Prozess. Versuchen Sie nun, Folgendes auf der Registerkarte Eingabe einzugeben:

pop
push 1
push 2
push 3
pop
pop
pop
push 4
push 5
push 6
push 7
push 8
push 9
end

Ich werde es versuchen.

Your input is [pop]
pop error.
Your input is [push 1]
1 pushed. index:4
Your input is [push 2]
2 pushed. index:3
Your input is [push 3]
3 pushed. index:2
Your input is [pop]
3 popped. index:2
Your input is [pop]
2 popped. index:3
Your input is [pop]
1 popped. index:4
Your input is [push 4]
4 pushed. index:4
Your input is [push 5]
5 pushed. index:3
Your input is [push 6]
6 pushed. index:2
Your input is [push 7]
7 pushed. index:1
Your input is [push 8]
8 pushed. index:0
Your input is [push 9]
push error.
Your input is [end]

Richtig, die gedrückten 1, 2 und 3 werden in umgekehrter Reihenfolge geöffnet. Wenn Sie versuchen zu popen, obwohl keine Ganzzahlen gespeichert sind, oder wenn Sie versuchen zu pushen, obwohl bereits 5 Ganzzahlen gespeichert sind, wird eine Fehlermeldung ausgegeben.

abschließend

Dieses Mal habe ich einen einfachen Stack mit der grundlegenden Java-Syntax implementiert. Sie können eine Warteschlange mit nur wenigen Änderungen am obigen Programm implementieren. Wenn Sie also Zeit haben, versuchen Sie es bitte.

Danke fürs Lesen.

Recommended Posts

Implementieren Sie so etwas wie einen Stack in Java
3 Implementieren Sie einen einfachen Interpreter in Java
[Java] Erstellen Sie so etwas wie eine Produktsuch-API
So implementieren Sie eine ähnliche Funktion in Rails
So implementieren Sie eine nette Funktion in Ajax mit Rails
Implementierung der zweistufigen Authentifizierung in Java
Implementieren Sie die Standardauthentifizierung in Java
Implementieren Sie Singleton mit Enum schnell in Java
Implementieren Sie eine Kombination aus Mathematik in Java
2 Implementieren Sie eine einfache Syntaxanalyse in Java
Implementieren Sie das Senden von E-Mails in Java
Implementieren Sie eine funktionsähnliche schnelle Sortierung in Java
Implementieren Sie rm -rf in Java.
Implementieren Sie die XML-Signatur in Java
Java lernen: Verwenden Sie Timer, um so etwas wie einen Bomben-Timer zu erstellen
Implementieren Sie einen tabellengesteuerten Test in Java 14
Ich habe ein PDF mit Java erstellt.
Implementieren Sie eine ähnliche Funktion für Posts
Implementieren Sie den gRPC-Client in Ruby
Implementieren Sie ein Kontaktformular in Rails
Versuchen Sie, Yuma in Java zu implementieren
Bleiben Sie in einem Java Primer stecken
1 Implementieren Sie eine einfache Phrasenanalyse in Java
Implementierung einer ähnlichen Funktion in Java
Erstellen Sie eine benannte SkipList in Java, die wie eine nach Redis sortierte Menge aussieht
Ich habe eine Sterling-Sorte geschrieben, die sich wie in Java anfühlt
Informationen zum Zurückgeben einer Referenz in einem Java Getter
Was ist eine Klasse in der Java-Sprache (3 /?)
Bei der Suche nach mehreren in einem Java-Array
So implementieren Sie die Datumsberechnung in Java
So implementieren Sie den Kalman-Filter mit Java
Implementieren Sie API Gateway Lambda Authorizer in Java Lambda
Versuchen Sie, n-ary Addition in Java zu implementieren
Machen Sie so etwas wie Javas Enum mit Typescript
[Erstellen] Ein Memorandum über das Codieren in Java
Verschiedene Dinge wie Bitflags in Java
Java erstellt eine Tabelle in einem Word-Dokument
Java erstellt ein Kreisdiagramm in Excel
Was ist eine Klasse in der Java-Sprache (1 /?)
Was ist eine Klasse in der Java-Sprache (2 /?)
Erstellen Sie eine TODO-App in Java 7 Create Header
So erzwingen Sie Codierungskonventionen in Java
Lassen Sie uns eine Taschenrechner-App mit Java erstellen
Teilen Sie eine Zeichenfolge in Java mit ". (Dot)"
Erstellen einer Matrixklasse in Java Teil 1
[Java] Implementieren Sie eine Funktion, die eine im Builder-Muster implementierte Klasse verwendet
Ich habe ein Programm zur Beurteilung von Primzahlen in Java erstellt
GetInstance () aus einer @ Singleton-Klasse in Groovy aus Java
Lesen Sie eine Zeichenfolge in einer PDF-Datei mit Java
Erstellen Sie eine CSR mit erweiterten Informationen in Java
Implementieren Sie Benutzerverwaltungsfunktionen in einem Assistentenformat
Eine Geschichte über das JDK in der Java 11-Ära
Partisierung in Java
So zeigen Sie eine Webseite in Java an
[Android / Java] Betreiben Sie eine lokale Datenbank in Room
Messen Sie die Größe eines Ordners mit Java
Versuchen Sie, ein Bulletin Board in Java zu erstellen
Änderungen in Java 11
Janken in Java