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
Mary-Kate Olsenoriginal
2024-11-28 11:39:18961parcourir

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())
    }
}

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

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!

Déclaration:
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