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.
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.
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.
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.
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.
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.
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.
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.
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.
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