数据结构之——队列

数据结构之——队列

一:队列的定义

队列是允许在一端进行插入操作,而在另一端进行删除操作的线性表,简称FIFO。(队列就像我们平时在超市买东西之后在收银台排队付钱一样,正在付钱的那一端即为队头,没付完一个人的钱这个人就会离开删除操作,然后在队伍的最后队尾还在源源不断的来人排队插入操作

队尾:允许插入的一端。
队头:允许删除的一端。

上面已经举了一个例子,再比如用键盘进行各种字母或数字的输入,到显示器上如记事本软件上的输入,都是队列的典型应用。

二:队列的抽象数据类型

ADT 队列(Queue)
Data
	队列也是线性表。所以储存的匀速具有相同的数据类型,相邻的元素具有前驱和
后继的关系。
Operation (操作)
	InitQueue(*Q)		队列的初始化操作,建立一个空队列Q
	DestoryQueue(*Q)	如果队列Q存在的话,销毁这个队列
	ClearQueue(*Q)		情况Q队列
	QueueEmpty(*Q)		如果队列为空,返回true,反之返回false
	GetHead(Q, *e)		若队列Q存在且非空,用e返回队列Q的队头元素
	EnQueue(*Q, e)		若队列Q存在,插入新元素e到队列Q中并成为队尾元素
	DeQueue(*Q, *e)		删除队列Q中队头元素,并用e返回其值
	QueueLength(Q)		返回队列Q的元素个数
endADT

三:循环队列

1:队列的顺序存储结构的不足

队列的入队列操作,就是在队尾追加一个元素,不需要移动任何元素,所以时间复杂度为O(1),和栈不同的是,队列元素的出队列是在队头,即下标为0的位置,也就意味着每进行一次出队列操作,队列中的所以元素都要向前移动一位,以保证队列的队头,即下标为 0 的位置不为空,此时时间复杂度为O(n)
但是:为什么出队列一定要全部移动呢,就比如说我们在外面吃麻辣烫,我们每个人都会领到自己的一个号码牌,上面就是我们的位置,大家会不会排成一列等自己的麻辣烫呢?不会,早就去找座位去了,我们只需要知道自己是多少号的就可以了,当我的前面的那位好了我们也不需要着急,因为我们有自己的号码,别人也插不了队,不需要大家都排个长队缓慢的向前移动,即大家只要知道自己的位序就可以了。

(1)假溢出现象:(如下图)
(每进行一次出队列操作不进行所有的元素均向前移动一位的前提下)
在这里插入图片描述按照要求,rear要向后面移动一位,但是,这个数组的元素总数就5个,在这种情况下接着入队列的话,因为数组末尾元素已经占用,再加的话就如图所示,发生数组越界的错误,但是我们的队列在下标为0、1的位置仍为空的。我们把这种现象叫做假溢出,这时我们就需要引出循环队列的思想了。

2:循环队列定义

	我们把队列的头尾相接的顺序储存结构称为循环队列

所以,解决假溢出的办法就是后面满了,就再从头开始,头尾相接的循环。

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值