note · data structures

Queues

Queues

Introduction

A queue is an abstract data structure that contains a collection of elements. Queue implements the FIFO mechanism i.e. the element that is pushed at the front is popped out first. Some of the principle operations in the stack are −

Enqueue - This adds a data value to the back of the queue

Dequeue - This removes the data value from the front of the queue

Complexities

Time Complexity

Write

O(1)

Access

O(1)

Implementation

Go with Linked List


type Node struct{
	data interface{}
	next *Node
}

func NewNode(d interface{}) *Node{
	return &Node{
		d,
		nil,
	}
}

type Queue struct{
	head *Node
	tail *Node
	count int
}

func (q *Queue) New() *Queue{
	return &Queue{
		nil,
		nil,
		0,
	}
}

func (q *Queue) size() int{
	return q.count
}

func (q *Queue) enqueue(d interface{}){
	n := NewNode(d)
	if q.head == nil{
		q.head = n
	}else{
		q.tail.next = n
	}
	q.count ++
	q.tail = n
}

func (q *Queue) dequeue() interface{}{
	if q.head == nil{
		return nil
	}

	n := q.head
	q.head = q.head.next

	if q.head == nil{
		q.tail = nil
	}
	q.count--
	return n.data
}

func (q *Queue) front() interface{}{
	return q.head
}

func (q *Queue) back() interface{}{
	return q.tail
}

func main() {
	var q Queue
	queue := q.New()
	queue.enqueue(1)
	queue.enqueue(2)
	queue.enqueue(3)
	fmt.Println("Front:", queue.front())
	fmt.Println("Back:", queue.back())
	fmt.Println("Size:", queue.size())
	fmt.Println(queue.dequeue())
	fmt.Println("Front:", queue.front())
	fmt.Println("Back:", queue.back())
	fmt.Println("Size:", queue.size())
	fmt.Println(queue.dequeue())
	fmt.Println("Size:", queue.size())
	fmt.Println(queue.dequeue())
	fmt.Println("Size:", queue.size())
	fmt.Println(queue.dequeue())
	fmt.Println("Size:", queue.size())
	fmt.Println(queue.dequeue())
	fmt.Println("Size:", queue.size())
}

Go with Slice

type Queue []interface{}

func (q *Queue) size() int{
	return len(*q)
}

func (q *Queue) enqueue(d interface{}){
	*q = append(*q,d)
}

func (q *Queue) dequeue() interface{}{
	if len(*q) == 0{
		return nil
	}
	head := (*q)[0]
	*q = (*q)[1:]
	return head
}

func (q *Queue) front() interface{}{
	return (*q)[0]
}

func (q *Queue) back() interface{}{
	index := len(*q)-1
	return (*q)[index]
}

func main() {
	var queue Queue
	queue.enqueue(1)
	queue.enqueue(2)
	queue.enqueue(3)
	fmt.Println("Front:", queue.front())
	fmt.Println("Back:", queue.back())
	fmt.Println("Size:", queue.size())
	fmt.Println(queue.dequeue())
	fmt.Println("Front:", queue.front())
	fmt.Println("Back:", queue.back())
	fmt.Println("Size:", queue.size())
	fmt.Println(queue.dequeue())
	fmt.Println("Size:", queue.size())
	fmt.Println(queue.dequeue())
	fmt.Println("Size:", queue.size())
	fmt.Println(queue.dequeue())
	fmt.Println("Size:", queue.size())
	fmt.Println(queue.dequeue())
	fmt.Println("Size:", queue.size())
}
Back toAll notes