Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Apprendre Queue Implementation and Applications | Section
Practice
Projects
Quizzes & Challenges
Quiz
Challenges
/
Go Data Structures

bookQueue Implementation and Applications

Glissez pour afficher le menu

Implementing a Queue in Go

A queue is a linear data structure that follows the First-In-First-Out (FIFO) principle. You add elements to the back (enqueue) and remove them from the front (dequeue). In Go, you can implement a queue using either a slice or a struct that manages a slice internally.

Using a Slice as a Queue

A Go slice is a flexible, dynamic array. You can use a slice to represent the queue, where:

  • The front of the queue is at index 0;
  • The back is at the last index;
  • You enqueue by appending to the slice;
  • You dequeue by removing the first element.

This approach is simple, but removing from the front of a slice can be inefficient for large queues, since it shifts all remaining elements.

// Simple queue implementation using a slice
var queue []int

// Enqueue: add to the back
queue = append(queue, 10)
queue = append(queue, 20)
queue = append(queue, 30)

// Dequeue: remove from the front
front := queue[0]
queue = queue[1:]

fmt.Println("Dequeued:", front) // Output: Dequeued: 10
fmt.Println("Queue:", queue)   // Output: Queue: [20 30]

Using a Struct for a More Efficient Queue

To avoid repeated shifting, you can wrap a slice in a struct and use two indices (front and back) to track the start and end of the queue. This makes enqueue and dequeue operations more efficient for large queues.

type Queue struct {
    items []int
    front int
}

func (q *Queue) Enqueue(value int) {
    q.items = append(q.items, value)
}

func (q *Queue) Dequeue() (int, bool) {
    if q.front >= len(q.items) {
        return 0, false // queue is empty
    }
    value := q.items[q.front]
    q.front++
    return value, true
}

func (q *Queue) IsEmpty() bool {
    return q.front >= len(q.items)
}

// Usage
q := &Queue{}
q.Enqueue(5)
q.Enqueue(7)
dequeued, ok := q.Dequeue() // dequeued: 5, ok: true

This struct-based approach avoids shifting elements, but the underlying slice can grow large if many elements are dequeued. To optimize further, periodically reset the slice when front becomes large.

Both methods are valid for implementing queues in Go. Choose the approach that best fits your use case and performance requirements.

main.go

main.go

copy
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
package main import ( "errors" "fmt" ) type Queue struct { items []int } func (q *Queue) Enqueue(item int) { q.items = append(q.items, item) } func (q *Queue) Dequeue() (int, error) { if len(q.items) == 0 { return 0, errors.New("queue is empty") } item := q.items[0] q.items = q.items[1:] return item, nil } func (q *Queue) IsEmpty() bool { return len(q.items) == 0 } func main() { queue := Queue{} queue.Enqueue(10) queue.Enqueue(20) queue.Enqueue(30) fmt.Println("Queue after enqueuing 10, 20, 30:", queue.items) item, _ := queue.Dequeue() fmt.Println("Dequeued:", item) fmt.Println("Queue now:", queue.items) item, _ = queue.Dequeue() fmt.Println("Dequeued:", item) fmt.Println("Queue now:", queue.items) fmt.Println("Is queue empty?", queue.IsEmpty()) item, _ = queue.Dequeue() fmt.Println("Dequeued:", item) fmt.Println("Is queue empty?", queue.IsEmpty()) }

Common Queue Operations

A queue is a linear data structure that follows the First-In-First-Out (FIFO) principle. You interact with a queue using a set of standard operations:

Enqueue

  • Add an element to the end (rear) of the queue;
  • The new item always joins the back of the queue;
  • This operation increases the size of the queue.

Dequeue

  • Remove and return the element at the front of the queue;
  • The element that was added first is removed first;
  • Attempting to dequeue from an empty queue should be handled safely.

Peek

  • Return the element at the front of the queue without removing it;
  • Allows you to see which item will be processed next;
  • Does not change the queue’s size.

Is Empty

  • Check if the queue contains any elements;
  • Returns true if the queue is empty, otherwise returns false.

These operations are fundamental to using queues in Go and are essential for tasks like scheduling, buffering, and managing resources in a controlled order.

question mark

Which statement best describes a queue in Go?

Select the correct answer

Tout était clair ?

Comment pouvons-nous l'améliorer ?

Merci pour vos commentaires !

Section 1. Chapitre 7

Demandez à l'IA

expand

Demandez à l'IA

ChatGPT

Posez n'importe quelle question ou essayez l'une des questions suggérées pour commencer notre discussion

Section 1. Chapitre 7
some-alt