普通非循环队列(用数组实现)

队列的应用场景

​                                                    

队列介绍

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

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

3 示意图:(使用数组模拟队列示意图)

注意:普通队列,非循环队列,队首和队尾一直增大,不能重复利用旧空间

队头刚开始在下标-1处,入队和出队front和rear都会一直增大下标,空间利用不充分

数组模拟队列

先完成一个非环形的队列(数组来实现)

思路分析:

代码实现队列的基本操作:

// 普通队列,非循环队列,队首和队尾一直增大,不能重复利用旧空间
package basicOperation

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

// 使用一个结构体管理队列
type Queue struct {
    maxSize int
    array   [5]int // 数组=>模拟队列
    front   int    //  表示指向队列首
    rear    int    // 表示指向队列的尾部
}

// 添加数据到队列   如果按照下面这种,则下标为0处为队头,队尾下标增大的方向延申
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++ //front初始为-1,不指向第一个元素,先加1才指向第一个元素
    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)
       }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值