[ Web Proxy ]
URL:
Viewing: https://raw.githubusercontent.com/FishGold/structures-algorithm/master/structures/queue/queue.go [Back]  [Original]

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
}

Web Proxy Viewer  |  New URL  |  Original Page