suchen
HeimBackend-EntwicklungGolangWie implementiert man eine Warteschlangendatenstruktur in Go mithilfe eines kreisförmigen Arrays korrekt?

How to Correctly Implement a Queue Data Structure in Go Using a Circular Array?

Wie implementiert man eine Warteschlange in Go?

Hintergrund:

In Go fehlt der Standardbibliothek ein Warteschlangencontainer . Um eine Warteschlange zu implementieren, können Sie ein kreisförmiges Array als zugrunde liegende Datenstruktur verwenden.

Erste Implementierung:

Der bereitgestellte Code verwendet ein kreisförmiges Array mit den folgenden Algorithmen:

  • Einfügung: Y in Warteschlange X einfügen: X[R]
  • Löschen: Y aus Warteschlange X löschen: wenn F = R, dann UNDERFLOW; Y

Wobei F die Vorderseite, R die Rückseite und M die Array-Länge ist.

Code und falsch Ausgabe:

Der bereitgestellte Code implementiert diese Algorithmen, aber die Ausgabe ist falsch Verhalten:

package main

import (
    "fmt"
)

type Queue struct {
    len        int
    head, tail int
    q          []int
}

func New(n int) *Queue {
    return &Queue{n, 0, 0, make([]int, n)}
}

func (p *Queue) Enqueue(x int) bool {
    p.q[p.tail] = x
    p.tail = (p.tail + 1) % p.len
    return p.head != p.tail
}

func (p *Queue) Dequeue() (int, bool) {
    if p.head == p.tail {
        return 0, false
    }
    x := p.q[p.head]
    p.head = (p.head + 1) % p.len
    return x, true
}

func main() {
    q := New(10)
    for i := 1; i <pre class="brush:php;toolbar:false">Output:

1 true
2 true
3 true
4 true
5 true
6 true
7 true
8 true
9 true
10 false
11 true
12 true

11 true
12 true
0 false
0 false
0 false
0 false
0 false
0 false
0 false
0 false
0 false
0 false

Lösung:

Um dieses Problem zu beheben, ist ein zusätzliches Feld erforderlich. Der geänderte Code enthält eine Prüfung, um sicherzustellen, dass die aktualisierte Schwanzposition nicht mit der des Kopfes übereinstimmt:

package main

import (
    "fmt"
)

type Queue struct {
    len        int
    head, tail int
    q          []int
}

func New(n int) *Queue {
    return &Queue{n, 0, 0, make([]int, n)}
}

func (p *Queue) Enqueue(x int) bool {
    p.q[p.tail] = x
    ntail := (p.tail + 1) % p.len
    ok := false
    if ntail != p.head {
        p.tail = ntail
        ok = true
    }
    return ok
}

func (p *Queue) Dequeue() (int, bool) {
    if p.head == p.tail {
        return 0, false
    }
    x := p.q[p.head]
    p.head = (p.head + 1) % p.len
    return x, true
}

func main() {
    q := New(10)
    for i := 1; i <p>Mit dieser Korrektur ist die Ausgabe korrekt:</p><pre class="brush:php;toolbar:false">1 true
2 true
3 true
4 true
5 true
6 true
7 true
8 true
9 true
10 true
11 true
12 true

1
2
3
4
5
6
7
8
9
10
11
12

Alternative Implementierung mithilfe von Slices:

In modernen Go-Versionen ist eine einfachere Implementierung mithilfe von möglich Slices:

package main

import (
    "fmt"
)

// Queue implements a queue using a slice.
type Queue []int

// Enqueue adds an element to the end of the queue.
func (q *Queue) Enqueue(x int) {
    *q = append(*q, x)
}

// Dequeue removes and returns the first element of the queue.
func (q *Queue) Dequeue() (int, bool) {
    if len(*q) == 0 {
        return 0, false
    }
    x := (*q)[0]
    *q = (*q)[1:]
    return x, true
}

func main() {
    q := Queue{}
    for i := 1; i <p>Diese Implementierung nutzt das dynamische Wachstum und die Speicherbereinigung von Slices und macht es sowohl effizient als auch praktisch.</p>

Das obige ist der detaillierte Inhalt vonWie implementiert man eine Warteschlangendatenstruktur in Go mithilfe eines kreisförmigen Arrays korrekt?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Verwenden von Init für die Paketinitialisierung in GoVerwenden von Init für die Paketinitialisierung in GoApr 24, 2025 pm 06:25 PM

In Go wird die Init -Funktion für die Paketinitialisierung verwendet. 1) Die Init -Funktion wird automatisch bei der Paketinitialisierung aufgerufen und ist geeignet, um globale Variablen zu initialisieren, Verbindungen zu setzen und Konfigurationsdateien zu laden. 2) Es kann mehrere Init -Funktionen geben, die in Dateireihenfolge ausgeführt werden können. 3) Bei der Verwendung sollten die Ausführungsreihenfolge, die Testschwierigkeit und die Leistungsauswirkungen in Betracht gezogen werden. 4) Es wird empfohlen, Nebenwirkungen zu reduzieren, die Abhängigkeitsinjektion zu verwenden und die Initialisierung zu verzögern, um die Verwendung von Init -Funktionen zu optimieren.

GO's Select Anweisung: Multiplexing gleichzeitige OperationenGO's Select Anweisung: Multiplexing gleichzeitige OperationenApr 24, 2025 pm 05:21 PM

GO'SSelectstatementsTreamlinesConcurrentProgrammingByMultiplexingoperationen.1) ITallowswaitingonMultiPhanneloperationen, ExecutingTheFirstreadyone) TheDefaultCasepreventsDeadlocksByAntheProgramtoprosectroseverifnooperation.3) itcanpeusedefoursend

Erweiterte Genauigkeitstechniken in Go: Kontext und KarteigruppenErweiterte Genauigkeitstechniken in Go: Kontext und KarteigruppenApr 24, 2025 pm 05:09 PM

Contextandwaitgroupsarecrucialingoforminggoroutineseffektiv.1) contextAllowSsignalingCancellationanddeadlinesAcrossapiobears, Sicherstellung von Goroutinescanbesten

Die Vorteile der Verwendung von GO for Microservices ArchitectureDie Vorteile der Verwendung von GO for Microservices ArchitectureApr 24, 2025 pm 04:29 PM

GoisbenficialformicroservicesDuetoitsSimplicity, Effizienz, Androbustconcurcysupport.1) GO'Sdesignemphesimplication und idealFormicroservices.2) seine Konzernmodelusings und ChannelsAllows -Handlings -Handlings -Handlings -Handlings -Handlings -Fassungen

Golang gegen Python: Die Vor- und NachteileGolang gegen Python: Die Vor- und NachteileApr 21, 2025 am 12:17 AM

GolangissidealforbuildingsCalablesSystemduetoitseffizienz und Konsumverkehr, whilepythonexcelsinquickScriptingandDataanalyseduetoitssimplication und VacevastEcosystem.golangsDesineScouragesCouragescournations, tadelcodedeanDitsGoroutaTinoutgoroutaTinoutgoroutaTinoutsGoroutinesGoroutinesGoroutsGoroutins, t

Golang und C: Parallelität gegen RohgeschwindigkeitGolang und C: Parallelität gegen RohgeschwindigkeitApr 21, 2025 am 12:16 AM

Golang ist in Gleichzeitigkeit besser als C, während C bei Rohgeschwindigkeit besser als Golang ist. 1) Golang erreicht durch Goroutine und Kanal eine effiziente Parallelität, die zum Umgang mit einer großen Anzahl von gleichzeitigen Aufgaben geeignet ist. 2) C über Compiler -Optimierung und Standardbibliothek bietet es eine hohe Leistung in der Nähe der Hardware, die für Anwendungen geeignet ist, die eine extreme Optimierung erfordern.

Warum Golang verwenden? Vorteile und Vorteile erläutertWarum Golang verwenden? Vorteile und Vorteile erläutertApr 21, 2025 am 12:15 AM

Gründe für die Auswahl von Golang umfassen: 1) Leistung mit hoher Genauigkeit, 2) statisches System, 3) Mechanismusmechanismus, 4) Reiche Standardbibliotheken und Ökosysteme, die es zu einer idealen Wahl für die Entwicklung einer effizienten und zuverlässigen Software machen.

Golang gegen C: Leistung und GeschwindigkeitsvergleichGolang gegen C: Leistung und GeschwindigkeitsvergleichApr 21, 2025 am 12:13 AM

Golang ist für schnelle Entwicklung und gleichzeitige Szenarien geeignet, und C ist für Szenarien geeignet, in denen extreme Leistung und Kontrolle auf niedriger Ebene erforderlich sind. 1) Golang verbessert die Leistung durch Müllsammlung und Parallelitätsmechanismen und eignet sich für die Entwicklung von Webdiensten mit hoher Konsequenz. 2) C erreicht die endgültige Leistung durch das manuelle Speicherverwaltung und die Compiler -Optimierung und eignet sich für eingebettete Systementwicklung.

See all articles

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

Video Face Swap

Video Face Swap

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

Heiße Werkzeuge

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver Mac

Dreamweaver Mac

Visuelle Webentwicklungstools

VSCode Windows 64-Bit-Download

VSCode Windows 64-Bit-Download

Ein kostenloser und leistungsstarker IDE-Editor von Microsoft

Herunterladen der Mac-Version des Atom-Editors

Herunterladen der Mac-Version des Atom-Editors

Der beliebteste Open-Source-Editor

SecLists

SecLists

SecLists ist der ultimative Begleiter für Sicherheitstester. Dabei handelt es sich um eine Sammlung verschiedener Arten von Listen, die häufig bei Sicherheitsbewertungen verwendet werden, an einem Ort. SecLists trägt dazu bei, Sicherheitstests effizienter und produktiver zu gestalten, indem es bequem alle Listen bereitstellt, die ein Sicherheitstester benötigen könnte. Zu den Listentypen gehören Benutzernamen, Passwörter, URLs, Fuzzing-Payloads, Muster für vertrauliche Daten, Web-Shells und mehr. Der Tester kann dieses Repository einfach auf einen neuen Testcomputer übertragen und hat dann Zugriff auf alle Arten von Listen, die er benötigt.