Golang 数据结构之【4.7环形队列】

JiBadBoy · · 2185 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

package main

import (
    "errors"
    "fmt"
)

//循环队列

const (
    MaxSize int = 20 // 存储空间初始分配量
)

type QElemType int // QElemType类型根据实际情况而定,这里假设为int
// 循环队列的顺序存储结构
type SqQueue struct {
    data [MaxSize]QElemType
    front int   //头指针
    rear int    //尾指针
}

//初始化队列
func (q *SqQueue) InitQueue()  {
    q.front = 0
    q.rear = 0
}

//清空队列
func (q *SqQueue) ClearQueue() {
    q.front = 0
    q.rear = 0
}
// 若队列q为空,则返回true,否则返回false
func (q *SqQueue) IsEmpty() bool {
    if q.front == q.rear {
        return true
    } else {
        return false
    }
}

// 返回q的元素个数, 也是队列的当前长度
func (q *SqQueue) Length() int {
    return (q.rear-q.front + MaxSize) % MaxSize
}

// 若队列不为空,用e返回q的对头元素,否则返回error
func (q *SqQueue) GetHead() (e QElemType, err error) {
    if q.IsEmpty() {
        return 0, errors.New("queue is empty")
    }
    e = q.data[q.front]
    return
}

// 若队列未满,则插入元素e为q新的队尾元素,否者返回error
func (q *SqQueue) Insert(e QElemType) error {
    if (q.rear + 1) % MaxSize == q.front {
        return errors.New("queue is full")
    }
    q.data[q.rear] = e //将元素e赋值给队尾
    q.rear = (q.rear + 1) % MaxSize // rear 指针向后移一位,若到最后则转到数组头部
    return nil
}

// 若队列不为空,则删除q中对头元素,用e返回取值,否则返回error
func (q *SqQueue) Del() (e QElemType, err error)  {
    if q.front == q.rear {
        return 0, errors.New("queue is empty")
    }
    e = q.data[q.front] // 将队头元素赋值给e
    q.front = (q.front + 1) % MaxSize   // front指针向后移一位,若到最后则转到数组头部
    return
}

// 遍历
func (q *SqQueue) Traverse()  {
    for i := q.front; i != q.rear ; i = (i + 1) % MaxSize {
        fmt.Println(q.data[i])
    }
}


func main()  {
    var q SqQueue
    q.InitQueue()
    fmt.Println("初始化队列后,队列是否为空:", q.IsEmpty())
    for i := 0 ; i < MaxSize - 1 ; i++ {
        d := i + 100
        q.Insert(QElemType(d))
    }
    fmt.Println("队列的长度:", q.Length())
    fmt.Println("队列是否为空:", q.IsEmpty())
    q.Traverse()

    for l := 1; l < 10 ; l++ {
        e, _ := q.Del()
        fmt.Println("删除的元素----", e)
        q.Insert(QElemType(l+1000))
    }
    q.Traverse()
    fmt.Println("队列的长度:", q.Length())
    e, _ := q.GetHead()
    fmt.Println("队列头元素", e)
}

有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:JiBadBoy

查看原文:Golang 数据结构之【4.7环形队列】

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

2185 次点击  
加入收藏 微博
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传