首页 > 后端开发 > Golang > 如何在Go中使用循环数组正确实现队列?

如何在Go中使用循环数组正确实现队列?

Mary-Kate Olsen
发布: 2024-11-28 11:39:18
原创
951 人浏览过

How to Correctly Implement a Queue in Go Using a Circular Array?

如何在 Go 中实现队列

本题探讨了使用循环数组作为底层数据在 Go 中实现简单队列结构。该方法遵循“计算机编程的艺术”中概述的算法。然而,最初提出的代码遇到了输出不正确的问题。

理解差异

代码的主要问题在于缺乏处理错误的机制队列已满的情况。圆形阵列方法需要一种方法来确定其何时达到容量。原始代码缺少此检查,导致尝试覆盖数组末尾之外的元素。

完善实现

要解决此问题,只需进行简单的修改被介绍。 Enqueue 函数现在包含一个条件来验证尾索引是否不等于头索引。如果它们相等,则队列已满,并且该函数返回 false。否则,它将元素添加到队列中,增加尾部索引,并返回 true。

改进的代码

以下是更新的代码:

package main

import (
    "fmt"
)

type Queue struct {
    len        int
    head, tail int
    q          []int
}

func New(n int) *Queue {
    return &Queue{n, 0, 0, make([]int, n)}
}

func (p *Queue) Enqueue(x int) bool {
    p.q[p.tail] = x
    ntail := (p.tail + 1) % p.len
    if ntail != p.head {
        p.tail = ntail
        return true
    }
    return false
}

func (p *Queue) Dequeue() (int, bool) {
    if p.head == p.tail {
        return 0, false
    }
    x := p.q[p.head]
    p.head = (p.head + 1) % p.len
    return x, true
}

func main() {
    q := New(10)
    for i := 1; i < 13; i++ {
        fmt.Println(i, q.Enqueue(i))
    }
    fmt.Println()
    for i := 1; i < 13; i++ {
        fmt.Println(q.Dequeue())
    }
}
登录后复制

通过此修改,代码可以正确处理入队和出队元素,从而产生预期的结果输出:

1 true
2 true
3 true
4 true
5 true
6 true
7 true
8 true
9 true
10 true
11 true
12 true

11 true
12 true
1 true
2 true
3 true
4 true
5 true
6 true
7 true
8 true
9 true
10 true
登录后复制

以上是如何在Go中使用循环数组正确实现队列?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板