数据结构 - 队列(图解+源码)

本文介绍了队列的基本概念和两种主要类型:顺序队列与循环队列。顺序队列在空间满时会出现"假上溢"现象,而循环队列通过环形空间解决了这一问题。详细讨论了两种队列的实现方式及其在存储空间利用上的差异,并提供了具体的运行效果分析。
摘要由CSDN通过智能技术生成

队列

概念

队列是一种特殊的线性表,特殊之处在于它遵循先入先出(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++
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值