数据结构之队列

本文介绍了数据结构中的队列,包括非环形队列和环形队列的概念及其实现。通过Go语言展示了队列的添加、删除和显示操作,并讨论了队列满和空的状态判断。此外,还对比了非环形队列和环形队列在处理满队列情况上的不同策略。
摘要由CSDN通过智能技术生成

数据结构之队列(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("没有这个选项")
   	}
   }
}

看完如果觉得对自己有帮助请点赞支持,谢谢

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值