go 数组实现非环形队列

一 队列的应用场景

银行排队

二 队列介绍

1 队列是一个有序列表,可以用数组或是链表来实现。

2 队列遵循先入先出的原则。即:先存入队列的数据,先取出。后存入的后取出。

3 示意图——使用数组模拟队列

说明:front 指向首节点的前一个节点

三 数组模拟队列

1 需求

完成一个非环形的队列,要求数组来实现。

2 分析

队列本身是有序列表,使用数组的结构来存储队列的数据,用maxSize来表示队列的最大容量。

因为队列的输出和输入是分别从前后端来处理,因此需要两个变量 front 和 rear 分别记录队列前后端的下标,front 会随着数据的输出而改变,而 rear 则是随着数据输入而改变,如下图所示。

思路分析

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++ // 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() {
   fmt.Println("队列当前的情况是:")
   // this.front 队首的元素的前一个下标
   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)
      }
   }
}

4 测试

1. 输入add 表示添加数据到队列
2. 输入get 表示从队列获取数据
3. 输入show 表示显示队列
4. 输入exit 表示退出程序
add
输入你要入队列数
1
加入队列ok
1. 输入add 表示添加数据到队列
2. 输入get 表示从队列获取数据
3. 输入show 表示显示队列
4. 输入exit 表示退出程序
show
队列当前的情况是:
array[0]=1    
1. 输入add 表示添加数据到队列
2. 输入get 表示从队列获取数据
3. 输入show 表示显示队列
4. 输入exit 表示退出程序
add
输入你要入队列数
2
加入队列ok
1. 输入add 表示添加数据到队列
2. 输入get 表示从队列获取数据
3. 输入show 表示显示队列
4. 输入exit 表示退出程序
show
队列当前的情况是:
array[0]=1    array[1]=2    
1. 输入add 表示添加数据到队列
2. 输入get 表示从队列获取数据
3. 输入show 表示显示队列
4. 输入exit 表示退出程序
get
从队列中取出了一个数= 1
1. 输入add 表示添加数据到队列
2. 输入get 表示从队列获取数据
3. 输入show 表示显示队列
4. 输入exit 表示退出程序
show
队列当前的情况是:
array[1]=2    
1. 输入add 表示添加数据到队列
2. 输入get 表示从队列获取数据
3. 输入show 表示显示队列
4. 输入exit 表示退出程序

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值