环形队列简单实现
环形队列是 队列的一种特殊形式。首先介绍队列,然后引申出循环队列。
队列又称为“先进先出”(FIFO)线性表
限定插入操作只能在队尾进行,而删除操作只能在队首进行
队列也可以采用顺序存储结构或链表结构来实现,分别称为顺序队列和链队列,下面就来简单实现。
package main
import (
"errors"
"fmt"
"os"
)
type CircleQueue struct {
maxSize int //最大值
array [5]int //数组
head int // 指向队列队首0
tail int // 指向队尾
}
//判断队列是否已满
func (this *CircleQueue) IsFull() bool {
return (this.tail+1)%this.maxSize == this.head
}
//判断队里是否为空
func (this *CircleQueue) IsEmpty() bool {
return this.tail == this.head
}
//进队列
func (this *CircleQueue) AddQueue(val int) (err error) {
if this.IsFull() {
return errors.New("队列已满")
}
//把值给尾部
this.array[this.tail] = val
this.tail = (this.tail + 1) % this.maxSize
return
}
//出队列
func (this *CircleQueue) GetQueue() (val int, err error) {
if this.IsEmpty() {
return 0, errors.New("队列已空")
}
val = this.array[this.head]
this.head = (this.head + 1) % this.maxSize
return
}
//显示队列元素
func (this *CircleQueue) ListQueue() {
fmt.Println("队列情况如下:")
//计算出队列多少元素
//比较关键的一步
size := (this.tail + this.maxSize - this.head) % this.maxSize
if size == 0 {
fmt.Println("队列已空")
}
//定义一个辅助变量 指向head
tempHead := this.head
for i := 0; i < size; i++ {
fmt.Printf("arr[%d]=%d\t", tempHead, this.array[tempHead])
tempHead = (tempHead + 1) % this.maxSize
}
fmt.Println()
}
//主函数
func main() {
//初始化一个队列
queue := &CircleQueue{
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.Print("请输入:")
fmt.Scanln(&key)
switch key {
case "add":
fmt.Println("输入你要入队列数")
fmt.Scanln(&val)
err := queue.AddQueue(val)
if err != nil {
fmt.Println(err.Error())
} else {
fmt.Println("加入队列ok")
}
case "get":
val, err := queue.GetQueue()
if err != nil {
fmt.Println(err.Error())
} else {
fmt.Println("从队列中取出了一个数=", val)
}
case "show":
queue.ListQueue()
case "exit":
os.Exit(0)
}
}
}