【 C 】队列 简记

版权声明:本博客内容来自于个人学习过程中的总结,参考了互联网以及书本、论文等上的内容,仅供学习交流使用,如有侵权,请联系我会重写!转载请注明地址! https://blog.csdn.net/Reborn_Lee/article/details/82735670

了解队列,不妨想象一下排队,比如在食堂排队打饭,先排上的人先接受服务,接受完服务之后退出(出队),后来的人只有在队尾插入队列(入队)。因此队列有队列头和队列尾,队头用于删除元素操作,队尾用来插入元素操作。

实现队列的方式有很多种,静态数组,动态数组和链式结构实现。

更官方一点这么描述队列:

队列的长度以及队列的元素类型等:

对队列的操作主要有以下几种:

队列的顺序存储实现:

上图定义了一个队列的结构,包含的元素为一个数组,一个队头和队尾的下标变量。

下面举例说明队列的顺序存储实现:

一开始的时候,队列的Front 和 Rear 都初始化为 -1,表示队列为空。

接下来,我们往队列里面加入一个工作,表示入队:我们知道入队是在队尾实现的,所以Rear下标加1,变为0.

再加入一个工作,Rear继续往后挪动:

接下来注意了,我们开始删除一个工作,我们上面也说了删除在队头删除:此时Front为0.

下面继续一系列这类的过程:总结起来就是当你入队时,队列的Rear加1,删除一个元素(出队),Front加1.

上图中的这个状态值得讨论一番,此时,队列尾部已经到头(已经排到数组的尾部),无法再加入,可是呢?队列头部又还有空间?怎么办呢?

解决这个问题的思路也很自然,后面排不下了,那就排到前面去嘛,下面引用顺环队列(也叫循环队列):

如下图,将上述数组形成一个环:

我们约定,一开始Front和Rear相等并指向某一个位置,Front和Rear相等的时候,队列为空:

接下来,我们加入元素:

删除一个元素(出队):

经过一系列操作,到达这个位置:

此时,我们如果再放一个元素:

那么队列的Front和Rear又指向了同一个位置,此时就存在一个问题了:

正如上图所说,Front == Rear ,队列是空还是满?

无法甄别!

如下思考:

可知,如果队列数组大小为N,则Front和Rear差距有N种情况,我们就是要依靠这N种情况来判断队列的情况,而队列装载元素情况有N + 1种,所以用N种状态来判别N + 1 种情况是不可能实现的。

必须另寻他路!

解决方案有三种:

1 是使用额外标记 Size,当你添加一个元素时,Size加1,删除一个元素时,Size减1,这样最后根据Size值是0还是队列数组的长度来判断队列是为空还是满。

2 是使用额外标记 tag,当你添加一个元素时,tag为1,删除一个元素时,tag为0,这样可以根据最后tag为1还是0来判断队列是空还是满。

3 是如果数组空间为n,那么我只使用n - 1个数组空间,这样就不会出现队列为空和满,Front和Rear都是相等的尴尬情况了。这也是我们下面所要采取的方法。

实现队列

判断队列满的原理是:

以下图这种情况为例:

执行下面这段代码,肯定成立,这是就说明队列满了!

像下面这种未满的情况:

执行下面的代码:

可见,继续在rear为4的这个数组位置插入一个元素!

出队列前,先判断队列是否为空。

如果不为空,则 front 加 1 这个位置的元素返回。


最后,提示下,上面所说的都是传统的队列实现方法。

队列的链式结构实现见博文:【 C 】队列的链式存储实现

猜你喜欢

转载自blog.csdn.net/Reborn_Lee/article/details/82735670