Heim > Backend-Entwicklung > Golang > Wie implementiert man eine Warteschlange in Go mithilfe eines kreisförmigen Arrays korrekt?

Wie implementiert man eine Warteschlange in Go mithilfe eines kreisförmigen Arrays korrekt?

Mary-Kate Olsen
Freigeben: 2024-11-28 11:39:18
Original
969 Leute haben es durchsucht

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

So implementieren Sie eine Warteschlange in Go

Diese Frage untersucht die Implementierung einer einfachen Warteschlange in Go unter Verwendung eines kreisförmigen Arrays als zugrunde liegende Daten Struktur. Der Ansatz folgt den in „Die Kunst der Computerprogrammierung“ beschriebenen Algorithmen. Beim ursprünglich vorgestellten Code trat jedoch ein Problem mit falscher Ausgabe auf.

Verstehen der Diskrepanz

Das Hauptproblem des Codes liegt im Fehlen eines Mechanismus zur Handhabung Situation, in der die Warteschlange voll ist. Der Ansatz der kreisförmigen Anordnung erfordert eine Möglichkeit, festzustellen, wann die Kapazität erreicht ist. Dem Originalcode fehlte diese Prüfung, was zu einem Versuch führte, Elemente über das Ende des Arrays hinaus zu überschreiben.

Verfeinerung der Implementierung

Um dieses Problem zu beheben, ist eine einfache Änderung erforderlich wird eingeführt. Die Enqueue-Funktion enthält jetzt eine Bedingung, um zu überprüfen, ob der Tail-Index nicht mit dem Head-Index übereinstimmt. Wenn sie gleich sind, ist die Warteschlange voll und die Funktion gibt false zurück. Andernfalls wird das Element zur Warteschlange hinzugefügt, der Endindex erhöht und true zurückgegeben.

Verbesserter Code

Hier ist der aktualisierte Code:

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
    if ntail != p.head {
        p.tail = ntail
        return true
    }
    return false
}

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 < 13; i++ {
        fmt.Println(i, q.Enqueue(i))
    }
    fmt.Println()
    for i := 1; i < 13; i++ {
        fmt.Println(q.Dequeue())
    }
}
Nach dem Login kopieren

Mit dieser Änderung verarbeitet der Code das Ein- und Ausreihen von Elementen korrekt, was zum erwarteten Ergebnis führt Ausgabe:

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

11 true
12 true
1 true
2 true
3 true
4 true
5 true
6 true
7 true
8 true
9 true
10 true
Nach dem Login kopieren

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

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage