Skip to content

Instantly share code, notes, and snippets.

@wuriyanto48
Last active April 15, 2022 14:39
Show Gist options
  • Save wuriyanto48/f598f9314ca44373badd29addb4273cf to your computer and use it in GitHub Desktop.
Save wuriyanto48/f598f9314ca44373badd29addb4273cf to your computer and use it in GitHub Desktop.
Queue data structure Golang
package main
import (
"fmt"
)
type Queue[T any] struct {
elements []T
size uint
rear uint
}
func NewQueue[T any](size uint) *Queue[T] {
elements := make([]T, size)
return &Queue[T]{
elements: elements,
size: size,
rear: 0,
}
}
func (q *Queue[T]) Elements() []T {
return q.elements
}
func (q *Queue[T]) Enq(t T) {
if q.rear == q.size {
newSize := q.size << 1
q.size = newSize
newElements := make([]T, newSize)
copy(newElements, q.elements)
q.elements = newElements
}
q.elements[q.rear] = t
q.rear = q.rear + 1
}
func (q *Queue[T]) Deq() *T {
if q.rear <= 0 {
return nil
}
t := q.elements[0]
q.elements = q.elements[1:q.rear]
q.rear = q.rear - 1
if q.rear <= (q.size >> 2) {
newSize := q.size >> 2
q.size = newSize
newElements := make([]T, newSize)
copy(newElements, q.elements)
q.elements = newElements
}
return &t
}
func (q *Queue[T]) Peek() *T {
if q.rear <= 0 {
return nil
}
t := q.elements[0]
return &t
}
func (q *Queue[T]) Last() *T {
if q.rear <= 0 {
return nil
}
t := q.elements[q.rear-1]
return &t
}
func (q *Queue[T]) Size() uint {
return q.size
}
func main() {
q := NewQueue[string](5)
q.Enq("alex")
q.Enq("bony")
q.Enq("andy")
fmt.Println("-------------------")
fmt.Println("size: ", q.Size())
fmt.Println(q.Elements())
fmt.Println("-------------------")
q.Enq("cece")
q.Enq("coci")
q.Enq("dody")
fmt.Println("-------------------")
fmt.Println("size: ", q.Size())
fmt.Println(q.Elements())
t := q.Peek()
if t != nil {
fmt.Println(*t)
}
l := q.Last()
if l != nil {
fmt.Println(*l)
}
fmt.Println("-------------------")
q.Deq()
q.Deq()
q.Deq()
q.Deq()
fmt.Println("size: ", q.Size())
fmt.Println(q.Elements())
fmt.Println("-------------------")
q.Enq("alex")
q.Enq("bony")
q.Enq("andy")
fmt.Println("size: ", q.Size())
fmt.Println(q.Elements())
}
package main
import (
"fmt"
)
type Queue[T any] struct {
elements []T
size uint
head uint
rear uint
}
func NewQueue[T any](size uint) *Queue[T] {
elements := make([]T, size)
return &Queue[T]{
elements: elements,
size: size,
head: 0,
rear: 0,
}
}
func (q *Queue[T]) Elements() []T {
return q.elements[q.head:q.rear]
}
func (q *Queue[T]) Enq(t T) {
if q.rear == q.size {
newSize := q.size << 1
q.size = newSize
newElements := make([]T, newSize)
copy(newElements, q.elements)
q.elements = newElements
}
q.elements[q.rear] = t
q.rear = q.rear + 1
}
func (q *Queue[T]) Deq() *T {
if q.rear <= 0 {
return nil
}
t := q.elements[q.head]
q.head = (q.head + 1) % q.size
if q.rear <= (q.size >> 2) {
newSize := q.size >> 2
q.size = newSize
newElements := make([]T, newSize)
copy(newElements, q.elements)
q.elements = newElements
}
return &t
}
func (q *Queue[T]) Peek() *T {
if q.rear <= 0 {
return nil
}
t := q.elements[0]
return &t
}
func (q *Queue[T]) Last() *T {
if q.rear <= 0 {
return nil
}
t := q.elements[q.rear-1]
return &t
}
func (q *Queue[T]) Size() uint {
return q.size
}
func main() {
q := NewQueue[string](5)
q.Enq("alex")
q.Enq("bony")
q.Enq("andy")
fmt.Println("-------------------")
fmt.Println("size: ", q.Size())
fmt.Println(q.Elements())
fmt.Println("-------------------")
q.Enq("cece")
q.Enq("coci")
q.Enq("dody")
fmt.Println("-------------------")
fmt.Println("size: ", q.Size())
fmt.Println(q.Elements())
t := q.Peek()
if t != nil {
fmt.Println(*t)
}
l := q.Last()
if l != nil {
fmt.Println(*l)
}
fmt.Println("--------- deque ----------")
fmt.Println(*q.Deq())
fmt.Println(*q.Deq())
fmt.Println(*q.Deq())
fmt.Println(*q.Deq())
fmt.Println("size: ", q.Size())
fmt.Println(q.Elements())
fmt.Println("-------------------")
q.Enq("alex")
q.Enq("bony")
q.Enq("andy")
fmt.Println(*q.Deq())
q.Enq("wury")
fmt.Println("size: ", q.Size())
fmt.Println(q.Elements())
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment