使用slice实现queue队列

队列实现

队列实现包括, 创建队列, 入队, 出队, 队列是否为空等等操作

队列是一个循环队列, 不占用空间;

1-2-3-4-5-6
| |
<----------

NewQ(num int)
EnQ()
DeQ()
IsEmptyQ()
IsFullQ()


type Queue struct {
	Size  int
	Front int
	End   int
	Elem  []int
}

const FullQ = 4

func main() {
	fmt.Println("hello Q")
	q := NewQ(FullQ)

	q.EnQ(10)
	q.EnQ(11)
	q.EnQ(13)
	q.EnQ(14)
	q.EnQ(15)
	//_ = q.DeQ()
	fmt.Println(q.Front, q.End, q.Size)
	_ = q.DeQ()
	fmt.Println(q.Front, q.End, q.Size)
	q.EnQ(16)
	q.PrtQ()
}

func (q *Queue) PrtQ() {

	for i := 0; i < q.Size; i++ {

		if q.Front > q.End { // 进入循环

		}
		pos := (i + q.Front + 1) % FullQ
		fmt.Printf("%d ", q.Elem[pos])
	}
}

func NewQ(num int) *Queue {
	Q := Queue{0, 0, 0, make([]int, num)}

	return &Q
}

func (q *Queue) EnQ(val int) {
	if q.IsFullQ() {
		return
	}

	q.End = (q.End + 1) % FullQ
	q.Elem[q.End%FullQ] = val
	q.Size++
}

func (q *Queue) DeQ() int {

	if q.IsEmptyQ() {
		return 0
	}

	q.Front = (q.Front + 1) % FullQ
	val := q.Elem[q.Front%FullQ]
	q.Size--
	return val

}

func (q *Queue) IsEmptyQ() bool {
	if q.Size == 0 {
		return true
	}
	return false
}

func (q *Queue) IsFullQ() bool {
	if FullQ == q.Size {
		fmt.Println("Q is full")
		return true
	}
	return false
}
posted @ 2018-10-25 09:38  学习成长  阅读(446)  评论(0编辑  收藏  举报