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)
}
有疑问加站长微信联系(非本文作者)