本队列有问题, 单向的,需要优化尾环形队列
package main
import (
"errors"
"fmt"
"os"
)
type Queue struct {
maxSize int
arr [4]int // 数组模拟队列
front int // 指向队列的最前面 队首
rear int // 指向队尾
}
func main() {
queue := &Queue{
maxSize: 4,
arr: [4]int{},
front: -1,
rear: -1,
}
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.addQueue(val)
if err != nil {
fmt.Println("添加错误", err)
} else {
fmt.Println("添加成功")
}
case "get":
val, err := queue.get()
if err != nil {
fmt.Println(err.Error())
}
fmt.Printf("取出一个数 %d
", val)
case "show":
queue.show()
case "exit":
os.Exit(0)
}
}
}
// 添加数据到队列
func (q *Queue) addQueue(value int) (err error) {
// 判断队列是否已满
if q.ifFull() {
return errors.New("队列已满")
}
q.rear++ // rear后移
q.arr[q.rear] = value
return nil
}
// 从队列中取出数据
func (q *Queue) get() (int, error) {
// 判断队列是否为空
if q.isEmpty() {
fmt.Println("队列为空")
}
q.front++
val := q.arr[q.front]
return val, nil
}
func (q *Queue) ifFull() bool {
return q.rear == q.maxSize-1 // rear 是队列尾部 含队列尾部
}
func (q *Queue) isEmpty() bool {
return q.rear == q.front
}
// 显示队列
func (q *Queue) show() {
// 找到队首 遍历到队尾
fmt.Println("
队列当前的情况是:")
for i := q.front + 1; i <= q.rear; i++ {
fmt.Printf("array[%d]=%d
", i, q.arr[i])
}
}
添加成功
1 add 添加数据到队列
2 get 从队列获取数据
3 show 显示队列
4 exit 退出队列
add
请输入一个数
3
添加成功
1 add 添加数据到队列
2 get 从队列获取数据
3 show 显示队列
4 exit 退出队列
show
队列当前的情况是:
array[0]=1
array[1]=2
array[2]=3
1 add 添加数据到队列
2 get 从队列获取数据
3 show 显示队列
4 exit 退出队列
get
取出一个数 1
1 add 添加数据到队列
2 get 从队列获取数据
3 show 显示队列
4 exit 退出队列
show
队列当前的情况是:
array[1]=2
array[2]=3
1 add 添加数据到队列
2 get 从队列获取数据
3 show 显示队列
4 exit 退出队列
get
取出一个数 2
1 add 添加数据到队列
2 get 从队列获取数据
3 show 显示队列
4 exit 退出队列
show
队列当前的情况是:
array[2]=3
1 add 添加数据到队列
2 get 从队列获取数据
3 show 显示队列
4 exit 退出队列
add
请输入一个数
4
添加成功
1 add 添加数据到队列
2 get 从队列获取数据
3 show 显示队列
4 exit 退出队列
show
队列当前的情况是:
array[2]=3
array[3]=4
1 add 添加数据到队列
2 get 从队列获取数据
3 show 显示队列
4 exit 退出队列
get
取出一个数 3
1 add 添加数据到队列
2 get 从队列获取数据
3 show 显示队列
4 exit 退出队列
get
取出一个数 4
1 add 添加数据到队列
2 get 从队列获取数据
3 show 显示队列
4 exit 退出队列
show
队列当前的情况是:
1 add 添加数据到队列
2 get 从队列获取数据
3 show 显示队列
4 exit 退出队列
add
请输入一个数
4
添加错误 队列已满
1 add 添加数据到队列
2 get 从队列获取数据
3 show 显示队列
4 exit 退出队列