基本介绍

队列是一个有序的列表,可以用数组或者链表来实现。
队列遵循先进先出的原则,即先存入队列的数据先取出,后存入的数据后取出。

单向队列

image.png

代码如下:

  1. package main
  2. import (
  3. "errors"
  4. "fmt"
  5. )
  6. type Queue struct {
  7. maxSize int
  8. queue [5]int // 模拟队列
  9. front int // 队首
  10. rear int // 队尾
  11. }
  12. func (q *Queue) AddQueue(num int) (err error) {
  13. // 当队尾在最后就不能再加入了
  14. if q.rear == q.maxSize-1 {
  15. err = errors.New("队列已满")
  16. return
  17. }
  18. q.rear++
  19. q.queue[q.rear] = num
  20. return
  21. }
  22. func (q *Queue) ShowQueue() {
  23. // 找到队首,遍历到队尾
  24. for i := q.front + 1; i <= q.rear; i++ {
  25. fmt.Printf("queue[%d]=%d\n", i, q.queue[i])
  26. }
  27. }
  28. func (q *Queue) GetQueue() (err error) {
  29. // 如果队列为空,则取不出数据
  30. if q.rear == q.front {
  31. err = errors.New("队列为空")
  32. return err
  33. }
  34. q.front ++
  35. fmt.Printf("出队列的数为:%d\n",q.queue[q.front])
  36. return
  37. }
  38. func main() {
  39. // 初始化
  40. queue := Queue{
  41. maxSize: 5,
  42. queue: [5]int{},
  43. front: -1,
  44. rear: -1,
  45. }
  46. for {
  47. fmt.Println("====================")
  48. fmt.Println("输入add 添加数据到队列")
  49. fmt.Println("输入get 从队列获取数据")
  50. fmt.Println("输入show 查询队列消息")
  51. fmt.Println("====================")
  52. var key string
  53. var value int
  54. fmt.Print("请输入选择:")
  55. _, _ = fmt.Scanln(&key)
  56. switch key {
  57. case "add":
  58. fmt.Print("请输入需要添加的数据:")
  59. _, _ = fmt.Scanln(&value)
  60. err := queue.AddQueue(value)
  61. if err != nil {
  62. fmt.Println(err)
  63. }
  64. case "get":
  65. fmt.Println("")
  66. err := queue.GetQueue()
  67. if err != nil {
  68. fmt.Println(err)
  69. }
  70. case "show":
  71. fmt.Println("查看队列消息")
  72. queue.ShowQueue()
  73. default:
  74. fmt.Println("选择错误")
  75. }
  76. }
  77. }

环形队列

思路:

  1. 当(tail + 1) % maxSize == head的时候队列满
  2. tail == head 表示队列为空
  3. 初始化时,tail =0 head = 0
  4. 统计队列元素:(tail + maxSize - head) % maxSize