Maison > développement back-end > Golang > Comment implémenter correctement une file d'attente dans Go à l'aide d'un tableau circulaire ?

Comment implémenter correctement une file d'attente dans Go à l'aide d'un tableau circulaire ?

Mary-Kate Olsen
Libérer: 2024-11-28 11:39:18
original
952 Les gens l'ont consulté

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

Comment implémenter une file d'attente dans Go

Cette question explore l'implémentation d'une file d'attente simple dans Go en utilisant un tableau circulaire comme données sous-jacentes structure. L'approche suit les algorithmes décrits dans « L'art de la programmation informatique ». Cependant, le code initial présenté a rencontré un problème avec une sortie incorrecte.

Comprendre l'écart

Le principal problème du code réside dans l'absence d'un mécanisme pour gérer le situation où la file d’attente est pleine. L'approche du réseau circulaire nécessite un moyen de déterminer quand il est à pleine capacité. Le code d'origine ne disposait pas de cette vérification, ce qui a entraîné une tentative d'écrasement des éléments au-delà de la fin du tableau.

Affinage de l'implémentation

Pour résoudre ce problème, une simple modification est introduit. La fonction Enqueue inclut désormais une condition pour vérifier si l'index de queue n'est pas égal à l'index de tête. S'ils sont égaux, la file d'attente est pleine et la fonction renvoie false. Sinon, il ajoute l'élément à la file d'attente, incrémente l'index de queue et renvoie vrai.

Code amélioré

Voici le code mis à jour :

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())
    }
}
Copier après la connexion

Avec cette modification, le code gère correctement les éléments de mise en file d'attente et de retrait, ce qui donne le résultat attendu :

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
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal