数据结构之队列(Queue)
一、定义
1) 队列是一个有序列表,可以用数组或者链表实现
2) 遵循先进先出的原则
二、 非环形队列
1、设计思路:
1)创建一个数组Array,作为队列的一个字段;
2)front(前端位置)初始化为-1;
3) real,表示队列尾部,初始化为-1
4) 完成队列的基本查找
AddQueue //加入队列
GetQueue //取出元素
ShowQueue //显示队列
type Queue struct{
maxSize int
front int
rear int
Arr [5]int
}
func (this *Queue) addQueue(val int) (err error){
if this.rear==this.maxSize-1{
return errors.New("Queue Full")
}
this.rear++
this.Arr[this.rear]=val
return
} //增加队列
func (this *Queue) showQueue(){
// for i,v:=range this.Arr{
// fmt.Printf("Arr[%d]=%d",i,v)
// } 遍历了所有的数据,故错误
fmt.Println("队列当前的情况是:")
for i:=this.front+1;i<=this.rear;i++{
fmt.Printf("array[%d]=%d\t",i,this.Arr[i])
}
fmt.Println()
}
func (this *Queue) getQueue()(val int,err error){
if this.front==this.rear{
return -1,errors.New("Queue Empty")
}
this.front++
return this.Arr[this.front],err
}
func main(){
var key string
var val int
queue:=&Queue{
maxSize:5,
front:-1,
rear:-1,
}
for{
fmt.Println("---请输入你要选择的选项---")
fmt.Scanln(&key)
switch key{
case "add" :
fmt.Println("请输入你要加入的值")
fmt.Scanln(&val)
queue.addQueue(val)
fmt.Println("加入成功")
case "show":
queue.showQueue()
case "getQueue":
val,err:=queue.getQueue()
if err!=nil{
fmt.Println(err)
fmt.Println("有错误")
}else{
fmt.Println("取出的值为",val)
}
case "exit":
os.Exit(0)
default:
fmt.Println("没有这个选项")
}
}
}
缺点:当数据满的时候,不能取出来,也不能存进去
三、环形队列
1、设计思路
1)(rear+1)%maxsize==front时候表示队列满了;(当rear在front的下方的时候)
2) rear == front 的时候表示队列为空;
3) 初始化的时候rear =0,front=0;
4) 统计该队列多少个元素(rear+maxSize-front)%maxSize;(可能出现rear在front上方的情况;
package main
import (
"fmt"
"errors"
"os"
)
type CircleQueue struct{
front int
rear int
Arr [5]int
maxSize int
}
func (this *CircleQueue) Push(val int) (err error){
if this.IsPull(){
return errors.New("Queue full")
}
this.Arr[this.rear]=val
this.rear=(this.rear+1)%this.maxSize
return
}
func (this *CircleQueue) Pop()(val int,err error){
if this.IsEmpty(){
return 0, errors.New("Queue Empty")
}
val=this.Arr[this.front]
this.front=(this.front+1)%this.maxSize
return val ,err
}
func (this *CircleQueue) Show(){
num:=this.Num()
tempfront:=this.front
for i:=0;i<num;i++{
fmt.Printf("Arr[%d]=%d\t",tempfront,this.Arr[tempfront])
tempfront=(tempfront+1)%this.maxSize
}
fmt.Println()
}
func (this *CircleQueue) IsPull() bool{
return (this.rear+1)%this.maxSize==this.front
} //判断是否满了
func (this *CircleQueue) IsEmpty() bool{
return this.rear==this.front
} //判断是否为空
func (this *CircleQueue) Num() int{
return (this.rear-this.front+this.maxSize)%this.maxSize
} //判断返回了多少值
func main(){
var key string
var val int
queue:=&CircleQueue{
maxSize:5,
front:0,
rear:0,
}
for{
fmt.Println("---请输入你要选择的选项---")
fmt.Scanln(&key)
switch key{
case "add" :
fmt.Println("请输入你要加入的值")
fmt.Scanln(&val)
err:=queue.Push(val)
if err!=nil{
fmt.Println(err)
}else{
fmt.Println("加入成功")
}
case "show":
queue.Show()
case "get":
val,err:=queue.Pop()
if err!=nil{
fmt.Println(err)
}else{
fmt.Println("取出的值为",val)
}
case "exit":
os.Exit(0)
default:
fmt.Println("没有这个选项")
}
}
}
看完如果觉得对自己有帮助请点赞支持,谢谢