La file d'attente circulaire est une structure de données couramment utilisée, qui se caractérise par sa capacité à recycler l'espace du tableau et à mettre en œuvre efficacement les opérations de file d'attente. En langage Go, nous pouvons implémenter une file d'attente circulaire via un tableau et deux pointeurs. Cet article approfondira l'implémentation de files d'attente circulaires dans le langage Go et fournira des exemples de code spécifiques.
Le principe de mise en œuvre de la file d'attente circulaire consiste principalement à utiliser l'utilisation circulaire de tableaux et à marquer la tête et la queue de la file d'attente via deux pointeurs avant et arrière. Lorsque le pointeur arrière atteint la fin du tableau, il peut être à nouveau pointé vers le début du tableau via l'opération modulo pour réaliser le recyclage de la file d'attente.
Définir la structure de la file d'attente circulaire
type CircularQueue struct { capacity int front int rear int data []interface{} }
Initialiser la file d'attente circulaire
func NewCircularQueue(capacity int) *CircularQueue { return &CircularQueue{ capacity: capacity, front: 0, rear: 0, data: make([]interface{}, capacity), } }
opération de mise en file d'attente
func (cq *CircularQueue) Enqueue(val interface{}) bool { if (cq.rear+1)%cq.capacity == cq.front { return false // 队列已满 } cq.data[cq.rear] = val cq.rear = (cq.rear + 1) % cq.capacity return true }
opération de mise en file d'attente
func (cq *CircularQueue) Dequeue() interface{} { if cq.front == cq.rear { return nil // 队列为空 } val := cq.data[cq.front] cq.front = (cq.front + 1) % cq.capacity return val }
package main import "fmt" type CircularQueue struct { capacity int front int rear int data []interface{} } func NewCircularQueue(capacity int) *CircularQueue { return &CircularQueue{ capacity: capacity, front: 0, rear: 0, data: make([]interface{}, capacity), } } func (cq *CircularQueue) Enqueue(val interface{}) bool { if (cq.rear+1)%cq.capacity == cq.front { return false } cq.data[cq.rear] = val cq.rear = (cq.rear + 1) % cq.capacity return true } func (cq *CircularQueue) Dequeue() interface{} { if cq.front == cq.rear { return nil } val := cq.data[cq.front] cq.front = (cq.front + 1) % cq.capacity return val } func main() { cq := NewCircularQueue(5) cq.Enqueue(1) cq.Enqueue(2) cq.Enqueue(3) fmt.Println(cq.Dequeue()) fmt.Println(cq.Dequeue()) fmt.Println(cq.Dequeue()) }
Grâce à l'exemple de code ci-dessus, nous avons implémenté une simple file d'attente circulaire et implémenté les opérations de mise en file d'attente et de retrait de la file d'attente. Cette implémentation basée sur des tableaux et des pointeurs utilise efficacement des tableaux de taille fixe et implémente les fonctions de base des files d'attente circulaires.
Résumé : grâce à l'introduction de cet article, les lecteurs peuvent mieux comprendre la mise en œuvre des files d'attente circulaires en langage Go et approfondir leur compréhension des files d'attente circulaires grâce à des exemples de code. J'espère que cet article sera utile aux lecteurs.
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!