package queue import "errors" type ElementType interface{} type Array []ElementType func New(cap int) *Queue { data := make(Array, cap) return &Queue{ Capacity: cap, Front: 1, Rear: 0, Size: 0, Data: &data, } } type QueueInterface interface { IsEmpty() bool IsFull() bool MakeEmpty() EnQueue(x ElementType) error DeQueue() (ElementType, error) } /* Queue implementation with Slice */ type Queue struct { Capacity int Front int Rear int Size int Data *Array } /* Return true if queue is empty */ func (s *Queue) IsEmpty() bool { return s.Size == 0 } /* Return true if the queue is full*/ func (s *Queue) IsFull() bool { return s.Size == s.Capacity } /* Make queue Empty */ func (s *Queue) MakeEmpty() { s.Front = 1 s.Rear = 0 s.Size = 0 empty_slice := (*s.Data)[:0] s.Data = &empty_slice } /* Push x enter queue at rear*/ func (s *Queue) EnQueue(x ElementType) error { if s.IsFull() { return errors.New("full queue") } s.Rear = s.succ(s.Rear) (*s.Data)[s.Rear] = x s.Size++ return nil } /*Get and delete x from queue at front */ func (s *Queue) DeQueue() (ElementType, error) { if s.IsEmpty() { return nil, errors.New("empty queue") } x := (*s.Data)[s.Front] s.Front = s.succ(s.Front) s.Size-- return x, nil } /* Enhance value circulate */ func (s *Queue) succ(value int) int { if value++; s.Capacity == value { value = 0 } return value }