2020-11-14:手写代码:怎么用数组实现不超过固定大小的队列?

举报
福大大架构师每日一题 发表于 2020/11/14 20:45:57 2020/11/14
【摘要】 福哥答案2020-11-14:环形数组即可实现。数组,pull序号,pop序号,长度,容量,需要保存这些信息。golang代码如下:package mainimport ( "errors" "fmt")/*怎么用数组实现不超过固定大小的队列?队列:环形数组*/func main() { fmt.Println("----------------------") if...

福哥答案2020-11-14:


环形数组即可实现。数组,pull序号,pop序号,长度,容量,需要保存这些信息。


golang代码如下:

package main

import (
    "errors"
    "fmt"
)

/*
怎么用数组实现不超过固定大小的队列?

队列:环形数组
*/
func main() {
    fmt.Println("----------------------")
    if true {
        fmt.Println("定长队列测试")
        stack := NewMyQueue(2)
        fmt.Println(stack.Push(1))
        fmt.Println(stack.Push(2))
        fmt.Println(stack.Push(3))
        fmt.Println("----")
        fmt.Println(stack.Pop())
        fmt.Println(stack.Pop())
        fmt.Println(stack.Pop())
        fmt.Println("\r\n----------------------")
    }
}

type MyQueue struct {
    Arr   []int
    Pushi int
    Popi  int
    Size  int //元素个数
    Limit int //最大容量,值不变
}

func NewMyQueue(l int) *MyQueue {
    ret := &MyQueue{}
    ret.Arr = make([]int, l)
    ret.Pushi = 0
    ret.Popi = 0
    ret.Size = 0
    ret.Limit = l
    return ret
}

func (f *MyQueue) Push(val int) error {
    if f.Size == f.Limit {
        return errors.New("栈满了,不能再加了")
    }
    f.Size++
    f.Arr[f.Pushi] = val
    f.Pushi = f.nextIndex(f.Pushi)
    return nil
}

func (f *MyQueue) Pop() (int, error) {
    if f.Size == 0 {
        return 0, errors.New("栈空了,不能再拿了")
    }
    f.Size--
    ans := f.Arr[f.Popi]
    f.Popi = f.nextIndex(f.Popi)
    return ans, nil
}

func (f *MyQueue) IsEmpty() bool {
    return f.Size == 0
}

//下一个序号,循环着来
func (f *MyQueue) nextIndex(i int) int {
    if i < f.Limit-1 {
        return i + 1
    } else {
        return 0
    }
}

执行结果如下:

image.png

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。