Go: Queue implementation (array)

package main

import (
  "errors"
  "fmt"
  "os"
)

type Queue struct {
  size  int
  array []int
  head  int
  tail  int
}

func (queue *Queue) Push(v int) error {
  if queue.IsFull() {
    return errors.New("queue is full")
  }
  queue.array[queue.tail] = v
  queue.tail = (queue.tail + 1) % queue.size
  return nil
}
func (queue *Queue) Pop() (v int, err error) {
  if queue.IsEmpty() {
    return 0, errors.New("queue is empty")
  }
  v = queue.array[queue.head]
  queue.head = (queue.head + 1) % queue.size
  return
}
func (queue *Queue) List() {
  fmt.Println("~~~~~~~~queue info~~~~~~~~")
  fmt.Println("size:", queue.Size())
  fmt.Println("head:", queue.head)
  fmt.Println("tail:", queue.tail)
  fmt.Println("queue.array:", queue.array)
  size := queue.Size()
  if size == 0 {
    fmt.Println("queue is empty")
  }
  head := queue.head
  for b := 0; b < size; b++ {
    fmt.Printf("queue[%d]=%d\t", head, queue.array[head])
    head = (head + 1) % queue.size
  }
  fmt.Println()
}
func (queue *Queue) Size() int {
  switch {
  case queue.tail > queue.head:
    return queue.tail - queue.head // queue.tail指向最后一个元素的下一个元素
  case queue.tail < queue.head:
    return queue.size - (queue.head - queue.tail)
  default:
    return 0
  }
}
func (queue *Queue) IsFull() bool {
  return (queue.tail+1)%queue.size == queue.head
}
func (queue *Queue) IsEmpty() bool {
  return queue.tail == queue.head
}
func main() {
  var size int = 4
  queue := &Queue{
    size:  size + 1,
    array: make([]int, size+1, size+1),
    head:  0,
    tail:  0,
  }
  fmt.Printf("%T %v %p\n", queue, queue, queue)

  var (
    key string
    v   int
  )
  for {
    fmt.Println("1. 输入add 表示添加数据到队列")
    fmt.Println("2. 输入get 表示从队列获取数据")
    fmt.Println("3. 输入show 表示显示队列")
    fmt.Println("4. 输入exit 表示退出队列")

    _, err := fmt.Scanln(&key)
    if err != nil {
      fmt.Println("input err:", err)
      // return
    }

    switch key {
    case "add":
      fmt.Println("输入你要入队列数")
      _, err = fmt.Scanln(&v)
      if err != nil {
        return
      }
      err = queue.Push(v)
      if err != nil {
        fmt.Println(err.Error())
      } else {
        fmt.Println("push success")
      }
    case "get":
      v, err = queue.Pop()
      if err != nil {
        fmt.Println(err.Error())
      } else {
        fmt.Println("value:", v)
      }
    case "show":
      queue.List()
    case "exit":
      os.Exit(0)
    }
  }
}

 

posted @ 2022-05-23 15:10  ascertain  阅读(20)  评论(0编辑  收藏  举报