数据结构之GO实现环形队列

环形队列简单实现


环形队列是 队列的一种特殊形式。首先介绍队列,然后引申出循环队列。
队列又称为“先进先出”(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)
		}
	}
}

猜你喜欢

转载自blog.csdn.net/weixin_43318506/article/details/106201247