如何在 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中文网其他相关文章!