Ein Artikel, der Sie in Java-Stacks und -Warteschlangen einführt
Dieser Artikel vermittelt Ihnen relevantes Wissen über Java. Er organisiert hauptsächlich Probleme im Zusammenhang mit Stacks und Warteschlangen, einschließlich der Definition, Anwendung, Implementierung und Bedienung von Stacks und Warteschlangen. Ich hoffe, es hilft allen.
Empfohlene Studie: „Java-Video-Tutorial“
Bevor Sie Stapel und Warteschlangen lernen, verstehen Sie zunächst, was eine lineare Tabelle ist: Speichern Sie jeweils ein einzelnes Element desselben Typs, und mehrere Elemente sind logisch fortlaufend. wie Arrays, verknüpfte Listen, Zeichenfolgen, Stapel und Warteschlangen
Stapel und Warteschlangen sind eigentlich lineare Listen mit begrenzten Operationen. Ob Arrays oder verknüpfte Listen, sie können am Kopf oder am Ende eingefügt und gelöscht werden, Stapel und Warteschlangen jedoch nur an einem Ende eingefügt und an einem Ende gelöscht werden
1. Stapel
1. Elemente können nur an einem Ende eingefügt werden und Elemente können nur an diesem Ende (oben im Stapel) gelöscht werden des Stapels als „Wasserbecher“. Elemente können nur an einem Ende hinzugefügt und Elemente nur aus einem Abschnitt gelöscht werden. Darüber hinaus befindet sich das Wasser, das zuerst in den Wasserbecher gelangt, am Boden des Bechers Das, was später in den Wasserbecher gelangt, befindet sich oben im Becher. Dasselbe gilt für die Elemente, die zuerst in den Stapel geschoben werden befinden sich unten im Stapel und die Elemente, die später in den Stapel geschoben werden, befinden sich oben im Stapel. Daher werden die Elemente, die zuerst in den Stapel geschoben werden, zuletzt herausgenommen und die Elemente, die in den Stapel geschoben werden Stapelletzte werden zuerst herausgenommen. Dies ist auch das Merkmal des Stapels: „Zuerst rein, zuletzt raus, zuletzt rein.“ „Zuletzt rein, zuerst raus“ (LIFO), entnommene Elemente und hinzugefügte Elemente können nur oben auf dem Stapel liegen .
Legen Sie 1 2 3 4 5 auf einmal in den Stapel2. Stapelanwendung
1. Nachdem Sie in einem beliebigen Editor etwas Falsches eingegeben haben, kehren Sie mit Strg + Z zum eingegebenen Wert zurück Inhalt;
Das Klicken auf den Zurück-Vorgang in einem beliebigen Browser ist eine Anwendung dieser Struktur des Stapels
1. Verwenden Sie den Editor, um den Rückgängig-Vorgang zu verwenden, und verschieben Sie den Inhalt nach der Eingabe in den Stapel. Wenn Sie ihn erneut eingeben, drücken Sie Wenn Sie einen Eingabefehler finden, verwenden Sie die Rückgängig-Operation, um den fehlerhaften Inhalt oben auf dem aktuellen Stapel abzulegen. Dann ist der Inhalt oben auf dem aktuellen Stapel der zuletzt eingegebene Inhalt.
2. Das Surfen im Internet basiert tatsächlich auf dem gleichen Prinzip, genau wie das Öffnen von Baidu -> Öffnen Sie csdn -> Öffnen Sie das Erstellungszentrum, das ebenfalls die Stapelstruktur verwendet. Schieben Sie zuerst die Baidu-Webseite in den Stapel und dann csdn-Webseite in den Stapel verschieben. Wenn Sie zur csdn-Startseite zurückkehren möchten, drücken Sie den Zurück-Pfeil, um die aktuell oben im Stapel befindliche Webseite anzuzeigen Nehmen Sie die csdn-Homepage heraus.
2. Betriebssystemstapel
Während der Ausführung des Programms wird Funktion B von Funktion A und Funktion C von Funktion B aufgerufen. Wenn der Aufruf endet und zur Ausführung zurückkehrt, woher wissen Sie, wo die Ausführung fortgesetzt werden soll? ? Dahinter steckt auch ein Stapel. Diese Struktur.
Stapelimplementierung basierend auf einer verknüpften Liste – verketteter Stapel.
Stapel implementiert basierend auf einem Array – sequenzieller Stapel (häufiger verwendet).//基于动态数组实现的顺序栈public class MyStack<e> { //记录当前栈的元素个数 private int size; //实际存储数据的动态数组,此时在栈中只能在数组的尾部添加和删除元素 private List<e> data = new ArrayList(); }</e></e>
/**
* 向当前栈中添加元素 -- >压栈操作
* @param val
*/
public void push(E val){
data.add(val);
size++;
}
Nach dem Login kopieren
3 Aktuelles oberstes Element des Stapels, aber nicht öffnen
/** * 向当前栈中添加元素 -- >压栈操作 * @param val */ public void push(E val){ data.add(val); size++; }
/** * 弹出当前栈顶元素,返回栈顶元素的值 * @return */ public E pop(){ if (isEmpty()){ //栈为空无法弹出 throw new NoSuchElementException("stack is empty!cannot pop!"); } //在数组末尾删除元素 E val = data.get(size - 1); data.remove(size - 1); size --; return val; }
2. Warteschlange
Warteschlange: First-In-First-Out (FIFO)-Datenstruktur i am Ende der Warteschlange und kann nur vom Kopf der Warteschlange entfernt werden. Die Reihenfolge beim Entfernen und Eintreten der Elemente wird konsistent beibehalten.
1 2 3 4 5 in die Warteschlange einreihen
Eine Warteschlange basierend auf verknüpfter Liste – verkettete Warteschlange
Die Dequeue-Operation kann nur an der Spitze von ausgeführt werden Wenn eine durch ein Array implementierte Warteschlange verwendet wird, müssen jedes Mal, wenn ein Element aus der Warteschlange entfernt wird, alle verbleibenden Elemente nach vorne verschoben werden. Zu diesem Zeitpunkt ist die durch die verknüpfte Liste implementierte Warteschlange besser für die Warteschlangenstruktur geeignet . Um ein Element zu löschen, müssen Sie nur den Kopfknoten löschen. Fügen Sie am Ende der verknüpften Listerrree
hinzu. Für Stapel gibt es viele Unterklassen der Warteschlangenimplementierung, z. B.
FIFO-WarteschlangeDouble -endete Warteschlange
Egal welche Warteschlange implementiert werden muss
1. Definieren Sie eine FIFO-Warteschlange
/** * 查看当前栈顶元素值,不弹出该元素 * @return */ public E peek(){ if (isEmpty()){ throw new NoSuchElementException("stack is empty!cannot peek!"); } return data.get(size - 1); }
3 vom Kopf der aktuellen Warteschlange
public interface Queue<e> { //入队操作 void offer(E val); //出队操作 E poll(); //查看队首元素 E peek(); boolean isEmpty();}</e>
4. Zeigen Sie das Kopfelement der aktuellen Warteschlange an
public E peek() { if (isEmpty()){ throw new NoSuchElementException("queue is empty!cannot peek!"); } return head.val; }
5.循环队列
1.定义:基本上都是使用固定长度的数组来实现,数组在实现队时,若从数组头部删除元素需要频繁的移动后面的元素,效率比较低;出队和入队操作,使用两个引用,一个head,一个tail,添加元素在数组的尾部添加,删除元素只需要移动head引用指向的地址即可(逻辑删除)
2.应用:操作系统的生产消费者模型,MySQL数据库的InnoDB存储引擎的redo日志
3.循环队列就是使用长度固定的数组来实现,数组头部就是队首(head),数组的尾部就是队尾(tail),数组[head…tail)时循环队列的有效元素
head永远指向循环队列的第一个元素
tai永远指向循环队列有效元素的后一个位置
此时循环队列的有效元素就为7 9 1两个元素
循环队列出队一个元素,就只用让head引用向后移动一个位置
此时循环队列的有效元素就只有9 和 1 两个元素了
再出队一个元素,但此时head引用已经走到末尾了,所谓循环队列就是当head或者tail引用走到数组末尾时,再向后移动就是返回数组头部的操作,循环队列最大好处就是进行元素的删除的时候不需要进行数据的搬移操作,当有新的元素添加到队列中就会覆盖掉原来的元素,就只需要将tail索引位置覆盖上新的元素,再让tail再向后移动
当队列为空时,head == tail
当队列已“满”时,head == tail
循环队列需要注意的关键点
1.因此当head 和 tail相等时,没法区分此时循环队列已满,还是为空,因此在循环队列中,若(tail + 1) % n == head就认为循环队列已满
此时循环队列就已经满了,在循环队列中就会浪费一个空间,判断队列是否已满
2.head和tail的移动不能简单的 + 1,使用取模操作,取数组长度
tail = (tail + 1) % n
head = (head + 1) % n
对数组长度取模的本质:
当head和tai走到数组最后一个索引位置时,下一次要返回数组头部,就必须用 + 1对数组长度取模
3.head == tail时,认为队列为空
6.循环队列的操作
1.定义一个循环队列
//基于整形的循环队列public class LoopQueue implements Queue<integer> { //定长数组 private Integer[] data; //指向队首元素 int head; //指向队尾元素的下一个元素 int tail; public LoopQueue(int size){ data = new Integer[size + 1]; }}</integer>
2.向循环队列中添加一个元素
@Override public void offer(Integer val) { if (isFull()){ throw new ArrayIndexOutOfBoundsException("loopQueue is full!cannot offer"); } data[tail] = val; tail = (tail + 1) % data.length; }
3.从循环队列中出队一个元素
@Override public Integer poll() { if (isEmpty()){ throw new NoSuchElementException("loopQueue is empty!cannot poll!"); } Integer val = data[head]; head = (head + 1) % data.length; return val; }
4.查看当前循环队列队首元素
@Override public Integer peek() { if (isEmpty()){ throw new NoSuchElementException("loopQueue is empty!cannot peek!"); } return data[head]; }
5.判断当前循环队列是否为空
@Override public boolean isEmpty() { return head == tail; }
6.判断当前循环队列是否已满
public boolean isFull(){ return (tail + 1) % data.length == head; }
7.toString方法
public String toString(){ StringBuilder sb = new StringBuilder(); sb.append("front ["); //最后一个有效元素的索引 int lsatIndex = tail == 0 ? data.length - 1 : tail - 1; for (int i = head; i != tail;) { sb.append(data[i]); if (i != lsatIndex){ sb.append(", "); } i = (i + 1) % data.length; } sb.append("] tail"); return sb.toString(); }
7.双端队列
双端队列:Deque是Queue的子接口,这个队列既可以尾插,头出;也可以头插,尾出
双端队列的一个常用子类就是LinkedList,不管使用栈还是队列,都可以统一使用双端队列接口
1.现在需要一个栈
2.现在需要一个队列
推荐学习:《java视频教程》
Das obige ist der detaillierte Inhalt vonEin Artikel, der Sie in Java-Stacks und -Warteschlangen einführt. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

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

Video Face Swap
Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heißer Artikel

Heiße Werkzeuge

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

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen

Leitfaden zur Smith-Zahl in Java. Hier besprechen wir die Definition: Wie überprüft man die Smith-Nummer in Java? Beispiel mit Code-Implementierung.

In diesem Artikel haben wir die am häufigsten gestellten Fragen zu Java Spring-Interviews mit ihren detaillierten Antworten zusammengestellt. Damit Sie das Interview knacken können.

Java 8 führt die Stream -API ein und bietet eine leistungsstarke und ausdrucksstarke Möglichkeit, Datensammlungen zu verarbeiten. Eine häufige Frage bei der Verwendung von Stream lautet jedoch: Wie kann man von einem Foreach -Betrieb brechen oder zurückkehren? Herkömmliche Schleifen ermöglichen eine frühzeitige Unterbrechung oder Rückkehr, aber die Stream's foreach -Methode unterstützt diese Methode nicht direkt. In diesem Artikel werden die Gründe erläutert und alternative Methoden zur Implementierung vorzeitiger Beendigung in Strahlverarbeitungssystemen erforscht. Weitere Lektüre: Java Stream API -Verbesserungen Stream foreach verstehen Die Foreach -Methode ist ein Terminalbetrieb, der einen Vorgang für jedes Element im Stream ausführt. Seine Designabsicht ist

Anleitung zum TimeStamp to Date in Java. Hier diskutieren wir auch die Einführung und wie man Zeitstempel in Java in ein Datum konvertiert, zusammen mit Beispielen.

Kapseln sind dreidimensionale geometrische Figuren, die aus einem Zylinder und einer Hemisphäre an beiden Enden bestehen. Das Volumen der Kapsel kann berechnet werden, indem das Volumen des Zylinders und das Volumen der Hemisphäre an beiden Enden hinzugefügt werden. In diesem Tutorial wird erörtert, wie das Volumen einer bestimmten Kapsel in Java mit verschiedenen Methoden berechnet wird. Kapselvolumenformel Die Formel für das Kapselvolumen lautet wie folgt: Kapselvolumen = zylindrisches Volumenvolumen Zwei Hemisphäre Volumen In, R: Der Radius der Hemisphäre. H: Die Höhe des Zylinders (ohne die Hemisphäre). Beispiel 1 eingeben Radius = 5 Einheiten Höhe = 10 Einheiten Ausgabe Volumen = 1570,8 Kubikeinheiten erklären Berechnen Sie das Volumen mithilfe der Formel: Volumen = π × R2 × H (4

PHP und Python haben jeweils ihre eigenen Vorteile, und die Wahl sollte auf Projektanforderungen beruhen. 1.PHP eignet sich für die Webentwicklung mit einfacher Syntax und hoher Ausführungseffizienz. 2. Python eignet sich für Datenwissenschaft und maschinelles Lernen mit präziser Syntax und reichhaltigen Bibliotheken.

PHP ist eine Skriptsprache, die auf der Serverseite weit verbreitet ist und insbesondere für die Webentwicklung geeignet ist. 1.PHP kann HTML einbetten, HTTP -Anforderungen und Antworten verarbeiten und eine Vielzahl von Datenbanken unterstützt. 2.PHP wird verwendet, um dynamische Webinhalte, Prozessformdaten, Zugriffsdatenbanken usw. mit starker Community -Unterstützung und Open -Source -Ressourcen zu generieren. 3. PHP ist eine interpretierte Sprache, und der Ausführungsprozess umfasst lexikalische Analyse, grammatikalische Analyse, Zusammenstellung und Ausführung. 4.PHP kann mit MySQL für erweiterte Anwendungen wie Benutzerregistrierungssysteme kombiniert werden. 5. Beim Debuggen von PHP können Sie Funktionen wie error_reporting () und var_dump () verwenden. 6. Optimieren Sie den PHP-Code, um Caching-Mechanismen zu verwenden, Datenbankabfragen zu optimieren und integrierte Funktionen zu verwenden. 7

Java ist eine beliebte Programmiersprache, die sowohl von Anfängern als auch von erfahrenen Entwicklern erlernt werden kann. Dieses Tutorial beginnt mit grundlegenden Konzepten und geht dann weiter zu fortgeschrittenen Themen. Nach der Installation des Java Development Kit können Sie das Programmieren üben, indem Sie ein einfaches „Hello, World!“-Programm erstellen. Nachdem Sie den Code verstanden haben, verwenden Sie die Eingabeaufforderung, um das Programm zu kompilieren und auszuführen. Auf der Konsole wird „Hello, World!“ ausgegeben. Mit dem Erlernen von Java beginnt Ihre Programmierreise, und wenn Sie Ihre Kenntnisse vertiefen, können Sie komplexere Anwendungen erstellen.
