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)
}
}
}