# Queue A queue is a kind of linear table. It only allows delete operations at the front of the table and insert operations at the rear of the table. This package includes ArrayQueue, LinkedQueue, CircularQueue, and PriorityQueue.
## Source - [https://github.com/duke-git/lancet/blob/main/datastructure/queue/arrayqueue.go](https://github.com/duke-git/lancet/blob/main/datastructure/queue/arrayqueue.go) - [https://github.com/duke-git/lancet/blob/main/datastructure/queue/linkedqueue.go](https://github.com/duke-git/lancet/blob/main/datastructure/queue/linkedqueue.go) - [https://github.com/duke-git/lancet/blob/main/datastructure/queue/circularqueue.go](https://github.com/duke-git/lancet/blob/main/datastructure/queue/circularqueue.go) - [https://github.com/duke-git/lancet/blob/main/datastructure/queue/priorityqueue.go](https://github.com/duke-git/lancet/blob/main/datastructure/queue/priorityqueue.go) ## Usage ```go import ( queue "github.com/duke-git/lancet/v2/datastructure/queue" ) ``` ## Index ### 1. ArrayQueue - [NewArrayQueue](#NewArrayQueue) - [Data](#ArrayQueue_Data) - [Enqueue](#ArrayQueue_Enqueue) - [Dequeue](#ArrayQueue_Dequeue) - [Front](#ArrayQueue_Front) - [Back](#ArrayQueue_Back) - [Size](#ArrayQueue_Size) - [IsEmpty](#ArrayQueue_IsEmpty) - [IsFull](#ArrayQueue_IsFull) - [Clear](#ArrayQueue_Clear) - [Contain](#ArrayQueue_Contain) ### 2. LinkedQueue - [NewLinkedQueue](#NewLinkedQueue) - [Data](#LinkedQueue_Data) - [Enqueue](#LinkedQueue_Enqueue) - [Dequeue](#LinkedQueue_Dequeue) - [Front](#LinkedQueue_Front) - [Back](#LinkedQueue_Back) - [Size](#LinkedQueue_Size) - [IsEmpty](#LinkedQueue_IsEmpty) - [Clear](#LinkedQueue_Clear) - [Contain](#LinkedQueue_Contain) ### 3. CircularQueue - [NewCircularQueue](#NewCircularQueue) - [Data](#CircularQueue_Data) - [Enqueue](#CircularQueue_Enqueue) - [Dequeue](#CircularQueue_Dequeue) - [Front](#CircularQueue_Front) - [Back](#CircularQueue_Back) - [Size](#CircularQueue_Size) - [IsEmpty](#CircularQueue_IsEmpty) - [IsFull](#CircularQueue_IsFull) - [Clear](#CircularQueue_Clear) - [Contain](#CircularQueue_Contain) ### 4. PriorityQueue - [NewPriorityQueue](#NewPriorityQueue) - [Data](#PriorityQueue_Data) - [Enqueue](#PriorityQueue_Enqueue) - [Dequeue](#PriorityQueue_Dequeue) - [IsEmpty](#PriorityQueue_IsEmpty) - [IsFull](#PriorityQueue_IsFull) - [Size](#PriorityQueue_Size) ## Documentation ### 1. ArrayQueue Common queue implemented by slice. ### NewArrayQueueReturn a ArrayQueue pointer with specific capacity
Signature: ```go func NewArrayQueue[T any](capacity int) *ArrayQueue[T] type ArrayQueue[T any] struct { items []T head int tail int capacity int size int } ``` Example: ```go package main import ( "fmt" queue "github.com/duke-git/lancet/v2/datastructure/queue" ) func main() { q := queue.NewArrayQueue[int](5) fmt.Println(q.Data()) // [] } ``` ### DataGet all queue data
Signature: ```go func (q *ArrayQueue[T]) Data() []T ``` Example: ```go package main import ( "fmt" queue "github.com/duke-git/lancet/v2/datastructure/queue" ) func main() { q := queue.NewArrayQueue[int](5) fmt.Println(q.Data()) // [] } ``` ### EnqueuePut element into queue, if queue is full, return false
Signature: ```go func (q *ArrayQueue[T]) Enqueue(item T) bool ``` Example: ```go package main import ( "fmt" queue "github.com/duke-git/lancet/v2/datastructure/queue" ) func main() { q := queue.NewArrayQueue[int](5) q.Enqueue(1) q.Enqueue(2) q.Enqueue(3) fmt.Println(q.Data()) // 1,2,3 } ``` ### DequeueRemove head element of queue and return it
Signature: ```go func (q *ArrayQueue[T]) Dequeue() (T, bool) ``` Example: ```go package main import ( "fmt" queue "github.com/duke-git/lancet/v2/datastructure/queue" ) func main() { q := queue.NewArrayQueue[int](5) q.Enqueue(1) q.Enqueue(2) q.Enqueue(3) fmt.Println(q.Dequeue()) // 1 fmt.Println(q.Data()) // 2,3 } ``` ### FrontJust get the head element of queue
Signature: ```go func (q *ArrayQueue[T]) Front() T ``` Example: ```go package main import ( "fmt" queue "github.com/duke-git/lancet/v2/datastructure/queue" ) func main() { q := queue.NewArrayQueue[int](5) q.Enqueue(1) q.Enqueue(2) q.Enqueue(3) fmt.Println(q.Front()) // 1 fmt.Println(q.Data()) // 1,2,3 } ``` ### BackJust get the tail element of queue
Signature: ```go func (q *ArrayQueue[T]) Back() T ``` Example: ```go package main import ( "fmt" queue "github.com/duke-git/lancet/v2/datastructure/queue" ) func main() { q := queue.NewArrayQueue[int](5) q.Enqueue(1) q.Enqueue(2) q.Enqueue(3) fmt.Println(q.Back()) // 3 fmt.Println(q.Data()) // 1,2,3 } ``` ### SizeGet the number of elements in queue
Signature: ```go func (q *ArrayQueue[T]) Size() int ``` Example: ```go package main import ( "fmt" queue "github.com/duke-git/lancet/v2/datastructure/queue" ) func main() { q := queue.NewArrayQueue[int](5) q.Enqueue(1) q.Enqueue(2) q.Enqueue(3) fmt.Println(q.Size()) // 3 } ``` ### IsEmptyCheck if queue is empty or not
Signature: ```go func (q *ArrayQueue[T]) IsEmpty() bool ``` Example: ```go package main import ( "fmt" queue "github.com/duke-git/lancet/v2/datastructure/queue" ) func main() { q := queue.NewArrayQueue[int](5) fmt.Println(q.IsEmpty()) // true q.Enqueue(1) q.Enqueue(2) q.Enqueue(3) fmt.Println(q.IsEmpty()) // false } ``` ### IsFullCheck if queue is full or not
Signature: ```go func (q *ArrayQueue[T]) IsFull() bool ``` Example: ```go package main import ( "fmt" queue "github.com/duke-git/lancet/v2/datastructure/queue" ) func main() { q := queue.NewArrayQueue[int](3) fmt.Println(q.IsFull()) // false q.Enqueue(1) q.Enqueue(2) q.Enqueue(3) fmt.Println(q.IsFull()) // true } ``` ### ClearClean all data in queue
Signature: ```go func (q *ArrayQueue[T]) Clear() ``` Example: ```go package main import ( "fmt" queue "github.com/duke-git/lancet/v2/datastructure/queue" ) func main() { q := queue.NewArrayQueue[int](5) q.Enqueue(1) q.Enqueue(2) q.Enqueue(3) q.Clear() fmt.Println(q.IsEmpty()) // true } ``` ### ContainCheck if the value is in queue or not
Signature: ```go func (q *ArrayQueue[T]) Contain(value T) bool ``` Example: ```go package main import ( "fmt" queue "github.com/duke-git/lancet/v2/datastructure/queue" ) func main() { q := queue.NewArrayQueue[int](5) q.Enqueue(1) q.Enqueue(2) q.Enqueue(3) fmt.Println(q.Contain(1)) // true fmt.Println(q.Contain(4)) // false } ``` ### 2. LinkedQueue Common queue implemented by link. ### NewLinkedQueueReturn a LinkedQueue pointer
Signature: ```go func NewLinkedQueue[T any]() *LinkedQueue[T] type LinkedQueue[T any] struct { head *datastructure.QueueNode[T] tail *datastructure.QueueNode[T] length int } type QueueNode[T any] struct { Value T Next *QueueNode[T] } ``` Example: ```go package main import ( "fmt" queue "github.com/duke-git/lancet/v2/datastructure/queue" ) func main() { q := queue.NewLinkedQueue[int]() fmt.Println(q.Data()) // [] } ``` ### DataGet all queue data
Signature: ```go func (q *LinkedQueue[T]) Data() []T ``` Example: ```go package main import ( "fmt" queue "github.com/duke-git/lancet/v2/datastructure/queue" ) func main() { q := queue.NewLinkedQueue[int]() fmt.Println(q.Data()) // [] } ``` ### EnqueuePut element into queue
Signature: ```go func (q *LinkedQueue[T]) Enqueue(value T) ``` Example: ```go package main import ( "fmt" queue "github.com/duke-git/lancet/v2/datastructure/queue" ) func main() { q := queue.NewLinkedQueue[int](5) q.Enqueue(1) q.Enqueue(2) q.Enqueue(3) fmt.Println(q.Data()) // 1,2,3 } ``` ### DequeueRemove head element of queue and return it
Signature: ```go func (q *LinkedQueue[T]) Dequeue() (T, error) ``` Example: ```go package main import ( "fmt" queue "github.com/duke-git/lancet/v2/datastructure/queue" ) func main() { q := queue.NewLinkedQueue[int](5) q.Enqueue(1) q.Enqueue(2) q.Enqueue(3) fmt.Println(q.Dequeue()) // 1 fmt.Println(q.Data()) // 2,3 } ``` ### FrontJust get the head element of queue
Signature: ```go func (q *LinkedQueue[T]) Front() (*T, error) ``` Example: ```go package main import ( "fmt" queue "github.com/duke-git/lancet/v2/datastructure/queue" ) func main() { q := queue.NewLinkedQueue[int](5) q.Enqueue(1) q.Enqueue(2) q.Enqueue(3) fmt.Println(q.Front()) // 1 fmt.Println(q.Data()) // 1,2,3 } ``` ### BackJust get the tail element of queue
Signature: ```go func (q *LinkedQueue[T]) Back() (*T, error) ``` Example: ```go package main import ( "fmt" queue "github.com/duke-git/lancet/v2/datastructure/queue" ) func main() { q := queue.NewLinkedQueue[int](5) q.Enqueue(1) q.Enqueue(2) q.Enqueue(3) fmt.Println(q.Back()) // 3 fmt.Println(q.Data()) // 1,2,3 } ``` ### SizeGet the number of elements in queue
Signature: ```go func (q *LinkedQueue[T]) Size() int ``` Example: ```go package main import ( "fmt" queue "github.com/duke-git/lancet/v2/datastructure/queue" ) func main() { q := queue.NewLinkedQueue[int](5) q.Enqueue(1) q.Enqueue(2) q.Enqueue(3) fmt.Println(q.Size()) // 3 } ``` ### IsEmptyCheck if queue is empty or not
Signature: ```go func (q *LinkedQueue[T]) IsEmpty() bool ``` Example: ```go package main import ( "fmt" queue "github.com/duke-git/lancet/v2/datastructure/queue" ) func main() { q := queue.NewLinkedQueue[int](5) fmt.Println(q.IsEmpty()) // true q.Enqueue(1) q.Enqueue(2) q.Enqueue(3) fmt.Println(q.IsEmpty()) // false } ``` ### ClearClean all data in queue
Signature: ```go func (q *LinkedQueue[T]) Clear() ``` Example: ```go package main import ( "fmt" queue "github.com/duke-git/lancet/v2/datastructure/queue" ) func main() { q := queue.NewLinkedQueue[int](5) q.Enqueue(1) q.Enqueue(2) q.Enqueue(3) q.Clear() fmt.Println(q.IsEmpty()) // true } ``` ### ContainCheck if the value is in queue or not
Signature: ```go func (q *LinkedQueue[T]) Contain(value T) bool ``` Example: ```go package main import ( "fmt" queue "github.com/duke-git/lancet/v2/datastructure/queue" ) func main() { q := queue.NewLinkedQueue[int](5) q.Enqueue(1) q.Enqueue(2) q.Enqueue(3) fmt.Println(q.Contain(1)) // true fmt.Println(q.Contain(4)) // false } ``` ### 3. CircularQueue Circular queue implemented by slice. ### NewCircularQueueReturn a CircularQueue pointer with specific capacity
Signature: ```go func NewCircularQueue[T any](capacity int) *CircularQueue[T] type CircularQueue[T any] struct { data []T front int rear int capacity int } ``` Example: ```go package main import ( "fmt" queue "github.com/duke-git/lancet/v2/datastructure/queue" ) func main() { q := queue.NewCircularQueue[int](5) fmt.Println(q.Data()) // [] } ``` ### DataGet all queue data
Signature: ```go func (q *CircularQueue[T]) Data() []T ``` Example: ```go package main import ( "fmt" queue "github.com/duke-git/lancet/v2/datastructure/queue" ) func main() { q := queue.NewCircularQueue[int](5) fmt.Println(q.Data()) // [] } ``` ### EnqueuePut element into queue, if queue is full, return error
Signature: ```go func (q *CircularQueue[T]) Enqueue(value T) error ``` Example: ```go package main import ( "fmt" queue "github.com/duke-git/lancet/v2/datastructure/queue" ) func main() { q := queue.NewCircularQueue[int](5) q.Enqueue(1) q.Enqueue(2) q.Enqueue(3) fmt.Println(q.Data()) // 1,2,3 } ``` ### DequeueRemove head element of queue and return it
Signature: ```go func (q *CircularQueue[T]) Dequeue() (*T, bool) ``` Example: ```go package main import ( "fmt" queue "github.com/duke-git/lancet/v2/datastructure/queue" ) func main() { q := queue.NewCircularQueue[int](5) q.Enqueue(1) q.Enqueue(2) q.Enqueue(3) val := q.Dequeue() fmt.Println(*val) // 1 fmt.Println(q.Data()) // 2,3 } ``` ### FrontJust get head element of queue
Signature: ```go func (q *CircularQueue[T]) Front() T ``` Example: ```go package main import ( "fmt" queue "github.com/duke-git/lancet/v2/datastructure/queue" ) func main() { q := queue.NewCircularQueue[int](5) q.Enqueue(1) q.Enqueue(2) q.Enqueue(3) fmt.Println(q.Front()) // 1 fmt.Println(q.Data()) // 1,2,3 } ``` ### BackJust get tail element of queue
Signature: ```go func (q *CircularQueue[T]) Back() T ``` Example: ```go package main import ( "fmt" queue "github.com/duke-git/lancet/v2/datastructure/queue" ) func main() { q := queue.NewCircularQueue[int](5) q.Enqueue(1) q.Enqueue(2) q.Enqueue(3) fmt.Println(q.Back()) // 3 fmt.Println(q.Data()) // 1,2,3 } ``` ### SizeGet the number of elements in queue
Signature: ```go func (q *CircularQueue[T]) Size() int ``` Example: ```go package main import ( "fmt" queue "github.com/duke-git/lancet/v2/datastructure/queue" ) func main() { q := queue.NewCircularQueue[int](5) q.Enqueue(1) q.Enqueue(2) q.Enqueue(3) fmt.Println(q.Size()) // 3 } ``` ### IsEmptyCheck if queue is empty or not
Signature: ```go func (q *CircularQueue[T]) IsEmpty() bool ``` Example: ```go package main import ( "fmt" queue "github.com/duke-git/lancet/v2/datastructure/queue" ) func main() { q := queue.NewCircularQueue[int](5) fmt.Println(q.IsEmpty()) // true q.Enqueue(1) q.Enqueue(2) q.Enqueue(3) fmt.Println(q.IsEmpty()) // false } ``` ### IsFullCheck if queue is full or not
Signature: ```go func (q *CircularQueue[T]) IsFull() bool ``` Example: ```go package main import ( "fmt" queue "github.com/duke-git/lancet/v2/datastructure/queue" ) func main() { q := queue.NewCircularQueue[int](3) fmt.Println(q.IsFull()) // false q.Enqueue(1) q.Enqueue(2) q.Enqueue(3) fmt.Println(q.IsFull()) // true } ``` ### ClearClean all data in queue
Signature: ```go func (q *CircularQueue[T]) Clear() ``` Example: ```go package main import ( "fmt" queue "github.com/duke-git/lancet/v2/datastructure/queue" ) func main() { q := queue.NewCircularQueue[int](5) q.Enqueue(1) q.Enqueue(2) q.Enqueue(3) q.Clear() fmt.Println(q.IsEmpty()) // true } ``` ### ContainCheck if the value is in queue or not
Signature: ```go func (q *CircularQueue[T]) Contain(value T) bool ``` Example: ```go package main import ( "fmt" queue "github.com/duke-git/lancet/v2/datastructure/queue" ) func main() { q := queue.NewCircularQueue[int](5) q.Enqueue(1) q.Enqueue(2) q.Enqueue(3) fmt.Println(q.Contain(1)) // true fmt.Println(q.Contain(4)) // false } ``` ### 4. PriorityQueue Common queue implemented by slice. ### NewPriorityQueueReturn a PriorityQueue pointer with specific capacity, param `comparator` is used to compare values of type T in the queue.
Signature: ```go func NewPriorityQueue[T any](capacity int, comparator lancetconstraints.Comparator) *PriorityQueue[T] type PriorityQueue[T any] struct { items []T size int comparator lancetconstraints.Comparator } ``` Example: ```go package main import ( "fmt" queue "github.com/duke-git/lancet/v2/datastructure/queue" ) func main() { q := queue.NewPriorityQueue[int](3) fmt.Println(q.Data()) // [] } ``` ### DataGet all queue data
Signature: ```go func (q *PriorityQueue[T]) Data() []T ``` Example: ```go package main import ( "fmt" queue "github.com/duke-git/lancet/v2/datastructure/queue" ) func main() { q := queue.NewPriorityQueue[int](3) fmt.Println(q.Data()) // [] } ``` ### EnqueuePut element into queue, if queue is full, return false
Signature: ```go func (q *PriorityQueue[T]) Enqueue(item T) bool ``` Example: ```go package main import ( "fmt" queue "github.com/duke-git/lancet/v2/datastructure/queue" ) type intComparator struct{} func (c *intComparator) Compare(v1, v2 any) int { val1, _ := v1.(int) val2, _ := v2.(int) if val1 < val2 { return -1 } else if val1 > val2 { return 1 } return 0 } func main() { comparator := &intComparator{} q := queue.NewPriorityQueue[int](10, comparator) for i := 1; i < 11; i++ { q.Enqueue(i) } fmt.Println(q.Data()) // 10, 9, 6, 7, 8, 2, 5, 1, 4, 3 } ``` ### DequeueRemove head element of queue and return it
Signature: ```go func (q *PriorityQueue[T]) Dequeue() (T, bool) ``` Example: ```go package main import ( "fmt" queue "github.com/duke-git/lancet/v2/datastructure/queue" ) type intComparator struct{} func (c *intComparator) Compare(v1, v2 any) int { val1, _ := v1.(int) val2, _ := v2.(int) if val1 < val2 { return -1 } else if val1 > val2 { return 1 } return 0 } func main() { comparator := &intComparator{} q := queue.NewPriorityQueue[int](10, comparator) for i := 1; i < 11; i++ { q.Enqueue(i) } val, ok := pq.Dequeue() fmt.Println(val) // 10 fmt.Println(q.Data()) // 9, 8, 6, 7, 3, 2, 5, 1, 4 } ``` ### IsEmptyCheck if queue is empty or not
Signature: ```go func (q *PriorityQueue[T]) IsEmpty() bool ``` Example: ```go package main import ( "fmt" queue "github.com/duke-git/lancet/v2/datastructure/queue" ) type intComparator struct{} func (c *intComparator) Compare(v1, v2 any) int { val1, _ := v1.(int) val2, _ := v2.(int) if val1 < val2 { return -1 } else if val1 > val2 { return 1 } return 0 } func main() { comparator := &intComparator{} q := queue.NewPriorityQueue[int](10, comparator) fmt.Println(q.IsEmpty()) // true for i := 1; i < 11; i++ { q.Enqueue(i) } fmt.Println(q.IsEmpty()) // false } ``` ### IsFullCheck if queue is full or not
Signature: ```go func (q *PriorityQueue[T]) IsFull() bool ``` Example: ```go package main import ( "fmt" queue "github.com/duke-git/lancet/v2/datastructure/queue" ) type intComparator struct{} func (c *intComparator) Compare(v1, v2 any) int { val1, _ := v1.(int) val2, _ := v2.(int) if val1 < val2 { return -1 } else if val1 > val2 { return 1 } return 0 } func main() { comparator := &intComparator{} q := queue.NewPriorityQueue[int](10, comparator) fmt.Println(q.IsFull()) // false for i := 1; i < 11; i++ { q.Enqueue(i) } fmt.Println(q.IsFull()) // true } ``` ### SizeGet nubmers of elements in queue
Signature: ```go func (q *PriorityQueue[T]) Size() int ``` Example: ```go package main import ( "fmt" queue "github.com/duke-git/lancet/v2/datastructure/queue" ) type intComparator struct{} func (c *intComparator) Compare(v1, v2 any) int { val1, _ := v1.(int) val2, _ := v2.(int) if val1 < val2 { return -1 } else if val1 > val2 { return 1 } return 0 } func main() { comparator := &intComparator{} q := queue.NewPriorityQueue[int](10, comparator) fmt.Println(q.IsFull()) // false for i := 1; i < 5; i++ { q.Enqueue(i) } fmt.Println(q.Size()) // 4 } ```