Golang队列实现中遇到的问题
Golang队列实现中遇到的问题 我们需要为队列实现编写代码,我们是这样做的:

package main
import "fmt"
type queue struct {
items []int
}
func (q *queue) insertion(item int) {
q.items = append(q.items, item)
}
func (q *queue) deletion() {
if len(q.items) == 0 {
fmt.Println("Out of Bounds")
}
items := q.items[1:]
q.items = items
}
func main() {
var n int
_, err := fmt.Scanln(&n)
if err != nil || n < 0 {
return
}
q := queue{}
q.insertion(n)
q.deletion(n)
}
不确定我们哪里做错了。
更多关于Golang队列实现中遇到的问题的实战教程也可以访问 https://www.itying.com/category-94-b0.html
8 回复
你正在读取数据切片,然后在末尾插入项目数量。
请重新阅读说明。你应该丢弃多少项,实际上你又丢弃了多少项?
请仔细检查错误,同时检查删除方法中的失败条件。
是的,我告诉过你原因。你调用了 deletion(n),但并没有一个接受任何参数的 deletion 函数。
你正试图从一个长度为2的切片中删除3个元素,这是无法做到的。在删除之前,请检查你的切片长度是否足够。
你从 stdin 读取一个数字,将其加入队列,然后调用带有一个参数的 deletion(),但只定义了无参数的 deletion()。
另外,请不要只是向我们抛出一些练习和代码,而是告诉我们你当前代码的问题所在。是编译时出现错误?还是输出不符合预期?等等。
你的队列实现有几个问题。主要问题包括:
- 删除方法签名错误:
deletion()方法被定义为无参数,但在main()中调用时传递了参数n - 切片操作效率问题:每次删除都创建新切片,导致内存重新分配
- 删除逻辑可以优化
这是修正后的代码:
package main
import (
"fmt"
)
type queue struct {
items []int
}
// 入队操作
func (q *queue) insertion(item int) {
q.items = append(q.items, item)
}
// 出队操作 - 修正为无参数
func (q *queue) deletion() (int, bool) {
if len(q.items) == 0 {
fmt.Println("Queue is empty")
return 0, false
}
item := q.items[0]
q.items = q.items[1:]
return item, true
}
// 查看队首元素
func (q *queue) peek() (int, bool) {
if len(q.items) == 0 {
return 0, false
}
return q.items[0], true
}
// 判断队列是否为空
func (q *queue) isEmpty() bool {
return len(q.items) == 0
}
func main() {
var n int
fmt.Print("Enter a number to insert into queue: ")
_, err := fmt.Scanln(&n)
if err != nil || n < 0 {
fmt.Println("Invalid input")
return
}
q := queue{}
// 入队操作
q.insertion(n)
fmt.Printf("Inserted %d into queue\n", n)
// 查看队首
if val, ok := q.peek(); ok {
fmt.Printf("Front of queue: %d\n", val)
}
// 出队操作 - 不再传递参数
if val, ok := q.deletion(); ok {
fmt.Printf("Deleted %d from queue\n", val)
}
// 测试空队列删除
if _, ok := q.deletion(); !ok {
fmt.Println("Deletion failed - queue is empty")
}
}
如果你需要更高效的队列实现(避免频繁的内存分配),可以使用指针跟踪队首位置:
type efficientQueue struct {
items []int
front int
}
func (q *efficientQueue) insertion(item int) {
q.items = append(q.items, item)
}
func (q *efficientQueue) deletion() (int, bool) {
if q.front >= len(q.items) {
// 定期清理已出队的元素
if q.front > 0 {
q.items = q.items[q.front:]
q.front = 0
}
return 0, false
}
item := q.items[q.front]
q.front++
return item, true
}
func (q *efficientQueue) length() int {
return len(q.items) - q.front
}
主要修改:
- 将
deletion()方法改为无参数,返回出队的元素和成功状态 - 添加了辅助方法
peek()和isEmpty() - 提供了更高效的队列实现选项,使用
front指针避免频繁切片操作 - 修正了
main()函数中的方法调用

