• 数组队列
  • 循环队列
  • 链式队列

数组队列

 1package Queue
 2type MyQueue interface {
 3   Size() int                //大小
 4   Front() interface{}       //第一个元素
 5   End() interface{}         //最后一个
 6   IsEmpty() bool            //是否为空
 7   EnQueue(data interface{}) //入队
 8   DeQueue() interface{}     //出队
 9   Clear()                   //清空
10}
11
12type Queue struct {
13   dataStore []interface{} //队列的数据存储
14   theSize   int           //队列的大小
15}
16
17func NewQueue() *Queue {
18   myqueue := new(Queue) //初始化,开辟结构体
19   myqueue.dataStore = make([]interface{}, 0)
20   myqueue.theSize = 0
21   return myqueue
22}
23
24func (myq *Queue) Size() int {
25   return myq.theSize
26}
27
28//取出第一个
29func (myq *Queue) Front() interface{} {
30   if myq.Size() == 0 {
31      return nil
32   }
33   return myq.dataStore[0]
34}
35//取出最后一个
36func (myq *Queue) End() interface{} {
37   if myq.Size() == 0 {
38      return nil
39   }
40   return myq.dataStore[myq.Size()-1]
41}
42
43func (myq *Queue) IsEmpty() bool {
44   return myq.theSize == 0
45}
46
47func (myq *Queue) EnQueue(data interface{}) {
48   myq.dataStore = append(myq.dataStore, data) //入队
49   myq.theSize++
50}
51
52func (myq *Queue) DeQueue() interface{} {
53   if myq.Size() == 0 {
54      return nil
55   }
56   data := myq.dataStore[0]
57   if myq.Size() > 1 {
58      myq.dataStore = myq.dataStore[1:myq.Size()]
59   } else {
60      myq.dataStore = make([]interface{}, 0)
61   }
62   myq.theSize--
63   return data //返回数据
64}
65
66func (myq *Queue) Clear() {
67   myq.dataStore = make([]interface{}, 0)
68   myq.theSize = 0
69}
 1package main
 2
 3import (
 4	"Queue"
 5	"fmt"
 6)
 7
 8func main() {
 9	myq := Queue.NewQueue()
10	myq.EnQueue(1)
11	myq.EnQueue(2)
12	myq.EnQueue(3)
13	myq.EnQueue(4)
14	fmt.Println(myq.DeQueue())
15	fmt.Println(myq.DeQueue())
16	fmt.Println(myq.DeQueue())
17	fmt.Println(myq.DeQueue())
18	myq.EnQueue(14)
19	myq.EnQueue(114)
20	fmt.Println(myq.DeQueue())
21	fmt.Println(myq.DeQueue())
22	myq.EnQueue(11114)
23	fmt.Println(myq.DeQueue())
24}

循环队列

 1package queue
 2
 3import "errors"
 4
 5//循环队列
 6const QueueSize = 5 //最多存储QueueSize-1个数据
 7//空一个空格标识满格
 8type CricleQueue struct {
 9	data  [QueueSize]interface{} //存储数据的结构
10	front int                    //头部的位置
11	rear  int                    //尾部的位置
12}
13
14func InitQueue(q *CricleQueue) { //初始化,头部尾部重合,为空
15	q.front = 0
16	q.rear = 0
17}
18func Queuelength(q *CricleQueue) int { //队列长度
19	return (q.rear - q.front + QueueSize) % QueueSize
20}
21func EnQueue(q *CricleQueue, data interface{}) (err error) {
22	if (q.rear+1)%QueueSize == q.front%QueueSize {
23		return errors.New("队列已经满了")
24	}
25	q.data[q.rear] = data             //入队
26	q.rear = (q.rear + 1) % QueueSize //循环 6,1
27	return nil
28}
29
30func DeQueue(q *CricleQueue) (data interface{}, err error) {
31	if q.rear == q.front {
32		return nil, errors.New("队列为空")
33	}
34	res := q.data[q.front]              //取出第一个数据
35	q.data[q.front] = 0                 //清空数据
36	q.front = (q.front + 1) % QueueSize //小于5  + 1,6回到1的位置
37	return res, nil
38}

链式队列

 1package queue
 2
 3type Node struct {
 4	data  interface{}
 5	pNext *Node
 6}
 7
 8// 链表队列
 9type QueueLink struct {
10	rear  *Node
11	front *Node
12}
13
14type LinkQueue interface {
15	length() int
16	Enqueue(value interface{})
17	Dequeue() interface{}
18}
19
20func NewLinkQueue() *QueueLink {
21	return &QueueLink{}
22}
23
24func (qlk *QueueLink) length() int {
25	pnext := qlk.front
26	length := 0
27	for pnext.pNext != nil {
28		pnext = pnext.pNext //节点循环跳跃
29		length++            //追加
30	}
31	return length //返回长度
32}
33func (qlk *QueueLink) Enqueue(value interface{}) {
34	newnode := &Node{value, nil} //新节点
35	if qlk.front == nil {
36		qlk.front = newnode //插入接一个节点
37		qlk.rear = newnode
38	} else {
39		qlk.rear.pNext = newnode
40		qlk.rear = qlk.rear.pNext
41	}
42
43}
44func (qlk *QueueLink) Dequeue() interface{} {
45	if qlk.front == nil {
46		return nil
47	}
48	newnode := qlk.front       //记录头部位置
49	if qlk.front == qlk.rear { //只剩下一个
50		qlk.front = nil
51		qlk.rear = nil
52	} else {
53		qlk.front = qlk.front.pNext //删除一个
54	}
55	return newnode.data
56
57}
 1package queue
 2
 3import "testing"
 4
 5func TestLinkQueue(t *testing.T) {
 6	myq := NewLinkQueue()
 7	for i := 1; i < 10000000; i++ {
 8		myq.Enqueue(i)
 9	}
10	for data := myq.Dequeue(); data != nil; data = myq.Dequeue() {
11		t.Log(data)
12	}
13}