队列
概念
队列是一种特殊的线性表,特殊之处在于它遵循先入先出(FIFO)原则,只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。
队列区分
根据队列的存储方式不同可以分为顺序存储(数组)和链式存储(链表),根据链表的形式又可以分为顺队列与循环队列
顺序队列
顺序队列顾名思义就是一条路走到黑,front指向队头,rear指向队尾,通过这两个下标对队列进行操作,如下图所示:
每次在队尾插入一个元素是,rear增1;每次在队头删除一个元素时,front增1。随着插入和删除操作的进行,队列元素的个数不断变化,队列所占的存储空间也在为队列结构所分配的连续空间中移动。当front=rear时,队列中没有任何元素,称为空队列。当rear增加到指向分配的连续空间之外时,队列无法再插入新元素。
顺序队列实现
package queue
import "fmt"
type Queue struct {
maxSize int
front int // 队列头节点默认为节点的前一个
rear int // 队列尾节点
queue []int
}
func NewQueue(maxSize int) *Queue {
q := new(Queue)
q.maxSize = maxSize
q.queue = make([]int, 0,maxSize)
q.front = -1
q.rear = -1
return q
}
// Add 向队列中添加元素
func (q *Queue) Add (val int) {
if q.isFull() {
fmt.Println("当前队列已满!")
return
}
q.queue = append(q.queue, val)
q.rear++
return
}
// Get 从队列中获取元素
func (q *Queue) Get () int {
if q.isEmpty() {
return -1
}
q.front++
return q.queue[q.front]
}
// Show 查看整个队列元素
func (q *Queue) Show() []int{
if q.isEmpty() {
return []int{
}
}
queues := make([]int, 0,q.maxSize)
for i := q.front +1; i <= q.rear; i++