结构体定义
type Queue struct { maxSize int // 队列的最大长度 array []int // 存放队列数组 head int // 指向队列队首 默认值 0 tail int // 指向队列队尾 默认值 0 }
分析:
- 什么时候队列满?(tail + 1) % maxSize == head
- tail == head 表示队列为空
- 初始化时,head = tail = 0
- 怎么统计队列有多少个元素?(tail + maxSize - head) % maxSize
代码实现
package main import ( "errors" "fmt" "os" ) type Queue struct { maxSize int // 队列的最大长度 array [5]int // 存放队列数组 head int // 指向队列队首 默认值 0 tail int // 指向队列队尾 默认值 0 } // 入队列 func (q *Queue) Push(val int) (err error) { if q.IsFull() { return errors.New("queue is full") } // q.tail 在队列尾部,但是不包含最后一个元素 q.array[q.tail] = val q.tail = (q.tail + 1) % q.maxSize return } // 出队列 func (q *Queue) Pop() (val int, err error) { if q.IsEmpty() { return 0, errors.New("queue is empty") } // q.head 指向队列队首,并且包含首元素 val = q.array[q.head] q.head = (q.head + 1) % q.maxSize return val, nil } // 显示队列 func (q *Queue) List() { fmt.Println("队列详情如下:") // 取出当前队列有多少个元素 size := q.Size() if size == 0 { fmt.Println("队列为空") return } // 设计一个辅助变量指向head temp := q.head for i := 0; i < size; i++ { fmt.Printf("array[%d]=%d\n", temp, q.array[temp]) temp = (temp + 1) % q.maxSize } fmt.Println() } // 判断队列是否为满 func (q *Queue) IsFull() bool { return (q.tail+1)%q.maxSize == q.head } // 判断队列是否为空 func (q *Queue) IsEmpty() bool { return q.tail == q.head } // 获取队列有多少个元素 func (q *Queue) Size() int { return (q.tail + q.maxSize - q.head) % q.maxSize } func main() { queue := Queue{ maxSize: 5, head: 0, tail: 0, } var key string var val int for { fmt.Println("1. 输入add,表示添加数据到队列") fmt.Println("2. 输入get,表示从队列获取数据") fmt.Println("3. 输入show,表示显示队列") fmt.Println("4. 输入exit,表示退出") fmt.Scanln(&key) switch key { case "add": fmt.Println("输入要入队列的数:") fmt.Scanln(&val) err := queue.Push(val) if err != nil { fmt.Println(err.Error()) } else { fmt.Println("加入队列成功") } case "get": val, err := queue.Pop() if err != nil { fmt.Println(err.Error()) } else { fmt.Println("从队列中取出一个数=", val) } case "show": queue.List() case "exit": os.Exit(0) } } }