(2)Go实现顺序队列

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

// 顺序队列的实现

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 今天下午,语文课的时候,老师让我们写家庭作业:黄冈小状元、课堂生字和预习课文。我一听到赶紧写课堂生字,过了十...
    俊浩阅读 1,364评论 0 3
  • 在网络上曾经看过一个段子:“女人哪有什么性冷淡,只是没有睡对人罢了。” 性,重要吗?当然重要! 有西方学者提出了一...
    小白云的兜率菜园阅读 13,168评论 62 91
  • 业务需求:一个页面加载2次请求,保证两次请求完成后,在页面加载数据。 参考:主要参考方法 注意: 是为了在主线程进...
    maomao_tong阅读 3,826评论 2 0
  • 文/亦诗 很多时候我们感觉时间过的好慢啊!可是,它却总在不经意间就为我们的青春画上了句号,来不及说再见,来不及去告...
    亦诗同学阅读 2,713评论 1 2

友情链接更多精彩内容