美文网首页Go数据结构
(2)Go实现顺序队列

(2)Go实现顺序队列

作者: 哥斯拉啊啊啊哦 | 来源:发表于2019-04-15 20:36 被阅读0次

队列是一种线性结构
只能从一端(队尾)添加元素,只能从另一端(队首)取出元素,属于先进先出的结构

// 顺序队列的实现

type queue interface{}

type sliceQueue struct {
    queues []queue
}

func NewQueue() *sliceQueue {
    return &sliceQueue{}
}

func (i *sliceQueue) Len() int {
    return len(i.queues)
}

func (i *sliceQueue) Cap() int {
    return cap(i.queues)
}

func (i *sliceQueue) Enqueue(item interface{}) {
    i.queues = append(i.queues, item)
}

func (i *sliceQueue) Dequeue() (queue, error) {
    if i.Len() == 0 {
        return nil, errors.New(
            "failed to dequeue,queue is empty ")
    }

    queue := i.queues[0]
    i.queues = i.queues[1:]
    return queue, nil
}

func (i *sliceQueue) GetFront() (queue, error) {
    if i.Len() == 0 {
        return nil, errors.New(
            "failed to getFront,queue is empty ")
    }
    return i.queues[0], nil
}

func (i *sliceQueue) IsEmpty() bool {
    return i.Len() == 0
}

// 队列测试
func main() {
    a := queue3.NewQueue()

    for i := 0; i < 5; i++ {
        a.Enqueue(strconv.Itoa(i) + "-hello toilet ")
    }

    fmt.Printf("isEmpty: %v, len=%v, cap=%v, getFront=%v\n",
        a.IsEmpty(), a.Len(), a.Cap(), fmt.Sprintln(a.GetFront()))
    fmt.Printf("isEmpty: %v, len=%v, cap=%v, dequeue=%v\n",
        a.IsEmpty(), a.Len(), a.Cap(), fmt.Sprintln(a.Dequeue()))
    fmt.Printf("isEmpty: %v, len=%v, cap=%v, dequeue=%v\n",
        a.IsEmpty(), a.Len(), a.Cap(), fmt.Sprintln(a.Dequeue()))
    fmt.Printf("isEmpty: %v, len=%v, cap=%v, dequeue=%v\n",
        a.IsEmpty(), a.Len(), a.Cap(), fmt.Sprintln(a.Dequeue()))
    fmt.Printf("isEmpty: %v, len=%v, cap=%v, dequeue=%v\n",
        a.IsEmpty(), a.Len(), a.Cap(), fmt.Sprintln(a.Dequeue()))
    fmt.Printf("isEmpty: %v, len=%v, cap=%v, dequeue=%v\n",
        a.IsEmpty(), a.Len(), a.Cap(), fmt.Sprintln(a.Dequeue()))
    fmt.Printf("isEmpty: %v, len=%v, cap=%v, dequeue=%v\n",
        a.IsEmpty(), a.Len(), a.Cap(), fmt.Sprintln(a.Dequeue()))
    fmt.Printf("isEmpty: %v, len=%v, cap=%v, getFront=%v\n",
        a.IsEmpty(), a.Len(), a.Cap(), fmt.Sprintln(a.GetFront()))
}
// 测试结果
isEmpty: false, len=5, cap=8, getFront=0-hello toilet  <nil>
isEmpty: false, len=5, cap=8, dequeue=0-hello toilet  <nil>
isEmpty: false, len=4, cap=7, dequeue=1-hello toilet  <nil>
isEmpty: false, len=3, cap=6, dequeue=2-hello toilet  <nil>
isEmpty: false, len=2, cap=5, dequeue=3-hello toilet  <nil>
isEmpty: false, len=1, cap=4, dequeue=4-hello toilet  <nil>
isEmpty: true, len=0, cap=3, dequeue=<nil> failed to dequeue,queue is empty 
isEmpty: true, len=0, cap=3, getFront=<nil> failed to getFront,queue is empty 

顺序队列的缺陷是每次取出元素,都要重新遍历一次队列,时间复杂度为O(n),冗余操作太多

下面链接有更好的实现方法,循环队列
https://www.jianshu.com/p/8a26bedb48a1

有bug欢迎指出,转载请注明出处。

相关文章

  • (2)Go实现顺序队列

    队列是一种线性结构只能从一端(队尾)添加元素,只能从另一端(队首)取出元素,属于先进先出的结构 顺序队列的缺陷是每...

  • Java数组实现循环队列

    Java数组实现循环队列 上一节(Java实现队列——顺序队列、链式队列)我们使用数组实现了顺序队列,但是在tai...

  • Java实现队列——顺序队列、链式队列

    Java实现队列——顺序队列、链式队列 概念 先进者先出,这就是典型的“队列”。(First In, First ...

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

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

  • (3)Go实现循环队列

    队列的实现方法2,循环队列 顺序队列取出元素的时间复杂度为O(n),循环队列取出元素的时间复杂度为O(1),相对快...

  • C语言实现链式队列

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

  • 数据结构之队列JAVA(三)

    java实现队列 顺序队列参考:http://www.cnblogs.com/CherishFX/p/460888...

  • 队列表示与操作实现

    一、顺序队列表示与操作实现1.1 定义常量及结构 1.2 循环队列方法实现 二、链队列表示与操作实现2.1 定义常...

  • 第五讲-队列

    队列:先进先出 基本操作:出队(enqueue)or入队(dequeue) 顺序队列和链式队列 用数组实现的队列叫...

  • 队列

    一、队列的顺序实现 1.队列的特点 先进先出,为了解决队列的假溢出问题,我们在顺序队列中空出一个位置方便队列的判断...

网友评论

    本文标题:(2)Go实现顺序队列

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