美文网首页
手把手教媳妇 用顺序存储实现一个简单的队列

手把手教媳妇 用顺序存储实现一个简单的队列

作者: 牛空空 | 来源:发表于2020-06-30 16:05 被阅读0次

首先了解下队列的基本概念,队列属于一种在一端进行插入在另一端进行删除或者说获取元素的特殊形式的线性表,和栈刚好相反,栈则是只能在一端进行插入,删除或者获取的线性表,下面用简单的顺序存储的方式来实现一个基本的队列的功能,先附上算法分析图


微信图片_20200630155613.png
package ds

import (
    "errors"
)

type Queue interface {
    Add(element interface{}) error
    Poll() (interface{}, error)
}

type DQueue struct {
    front int
    rear  int
    list  []interface{}
}

//入队操作
func (q *DQueue) Add(el interface{}) error {

    // 判断队列是否已满
    if q.rear+1 == q.front || (q.front == -1 && q.rear == len(q.list)-1) {
        return errors.New("队列已经满,无法存储")
    }

    //解决假性溢出问题
    if q.rear+1 >= len(q.list) {
        q.rear = (q.rear + 1) % len(q.list)
    } else {
        q.rear += 1
    }
    //存放数据到队列
    q.list[q.rear] = el
    return nil

}

//出队操作
func (q *DQueue) Poll() (interface{}, error) {

    //判断是否是空队列
    if q.front == q.rear {
        return nil, errors.New("队列为空,没有数据")
    }
    //解决假性溢出问题
    if q.front+1 >= len(q.list) {
        q.front = (q.front + 1) % len(q.list)
    } else {
        q.front += 1
    }
    return q.list[q.front], nil
}

//创建队列
func NewDQueue(cap int) *DQueue {

    return &DQueue{
        front: -1,
        rear:  -1,
        list:  make([]interface{}, cap),
    }
}

测试代码

func TestQueue(a *testing.T) {

    //初始化队列,空间为10
    queue := NewDQueue(10)

    for i := 1; i < 100; i += 2 {

        err := queue.Add(fmt.Sprintf("元素%d", i))
        log.Printf("错误信息:%v------队列:%v", err, queue.list)
        if err != nil {
            break
        }

    }

    //从队列获取元素
    for {
        data, err := queue.Poll()
        log.Printf("%v------%v", data, err)
        if err != nil {
            break
        }
    }

}

测试结果如下


微信图片_20200630155933.png

ps:这个例子着重记录,顺序存储的队列的算法,每次只能入队一个元素,也是非线程(goroutine)安全的,如果要保证线程安全,可以使用sync包的Mutex锁,如果是为了支持goroutine安全又能实现队列的效果,直接使用go原生的 带缓存的 channel 更合适,此处单纯为了复习算法

相关文章

  • 手把手教媳妇 用顺序存储实现一个简单的队列

    首先了解下队列的基本概念,队列属于一种在一端进行插入在另一端进行删除或者说获取元素的特殊形式的线性表,和栈刚好相反...

  • 数据结构之队列的链式存储结构

    之前写了队列的顺序存储结构,队列的定义及操作见 数据结构之队列的顺序存储结构 队列的链式存储结构与操作实现 队列接...

  • 循环队列

    循环队列 队列的实现上我们更愿意用链式存储结构来存储。 一、队列的顺序存储结构 先按照应有的思路来考虑下如何构造队...

  • 数据结构之队列

    队列:受限制的线性表,先进先出 队列可以用顺序存储,也可以用链式存储,顺序存储一般指数组,链式就是链表 用数组存储...

  • 数据结构-5.队列-顺序队列

    1. 队列是一个有序列表,可以用数组(顺序存储)或链表来实现(链式存储) 2. 遵循先入先出的原则,即先存入队列的...

  • 【数据结构】【C#】008-队列:👬👬顺序队列(循环队列)

    C#数据结构:顺序队列 1、 顺序队列的假溢出现象 队列的一种顺序存储称为顺序队列。与顺序栈类似,在队列的顺序存储...

  • 队列的顺序存储实现

    队列是和堆栈一样是一种特殊的线性表,和堆栈不一样的地方是是,堆栈是以后进先出的的数据组织方式,而队列则正好相反先进...

  • C语言实现链式队列

    链式队列,简称"链队列",即使用链表实现的队列存储结构。链式队列的实现思想同顺序队列类似,只需创建两个指针(命名为...

  • 队列

    顺序存储结构队列 循环队列 链队列

  • 队列

    一种可以实现“先进先出”的存储结构。 分类: 链式队列:用链表实现; 静态队列:用数组实现,通常都是循环队列。 循...

网友评论

      本文标题:手把手教媳妇 用顺序存储实现一个简单的队列

      本文链接:https://www.haomeiwen.com/subject/izexqktx.html