数据结构之Go实现队列

队列的相关概念

队列(queue)也是一种线性表,它的特性是先进先出,插入在一端,删除在另一端。就像排队一样,刚来的人入队(push)要排在队尾(rear),每次出队(pop)的都是队首(front)的人。其特点如下:
1.队列中的数据元素遵循“先进先出”(First In First Out)的原则,简称FIFO结构。
2.队尾添加元素,在队头删除元素。
假如我们有一个存储整型元素的队列,我们依次入队1、2、3.
在这里插入图片描述

其代码实现如下:

package main

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

//使用一个结构体管理
type Queue struct {
	maxSize int//数组最大值
	array [5]int//模拟队列
	front int//指向队列首
	rear int//表示指向队列尾
}
//添加数据到队列
func (this *Queue)AddQueue(val int)(err error){
	//判断队列是否已满
	if this.rear == this.maxSize-1{//rear队列尾部,含最后的元素
	return errors.New("queue full")

	}
	this.rear++
	this.array[this.rear]=val
	return
}
//从队列中取
func(this *Queue)GetQueue()(val int,err error){
	//判断书否为空
	if this.rear==this.front{//队空

	return -1 ,errors.New("queue empty")
	}
	this.front++
	val=this.array[this.front]
	return val,err
}
func(this *Queue)showQueue(){
	for i:=this.front+1;i<=this.rear;i++{
fmt.Printf("array[%d]=%d\t",i,this.array[i])
	}
	fmt.Println()
}
func main() {
	//先创建一个队列
	queue:= &Queue{
		maxSize: 5,
		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.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.showQueue()
		case "exit":
			os.Exit(0)

		}

	}

猜你喜欢

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