1.循环数组实现单调队列
1.1 普通队列实现
- 普通的队列数据结构:先进先出,这里的“进”就是数据从队列的尾进,这里的“出”就是从队列的头出。
- 很显然循环数组队列比单方向的数组队列的效率更高,更优,这里我就不再过多赘述。
1.1.1定义循环队列(循环队列的结构)
(1)首先是如何确定队列的“首尾”,这里我用两个变量head,tail,它们分别存储着循环队列首尾元素的数组下标。
(2)如何实现循环?:注意因为队列的元素一定是在 head–tail之间的,而很显然,这可以有两种情况吧,一种是顺势针,一种是逆时针,如下图,为了方便我们选择顺时针这种情况
(3)如何利用head和tail的位置关系推断出队列空还是满如上图所示,数组有5个空间,那么队列数据的存放就有6种情况,,分别是0个,1个。。。。5个,那么head和tail的相对情况则只有5种,分别是 0(tail=head),1(tail与head相邻),2(相隔一个空间)。。4(相隔三个空间)。那么这里我们用5种情况去表示6种状态,很显然一定会有1种情况表示了两种状态,很显然不行
- 对此解决方法是我们留一个空间不用,这样队列数据的存放情况就少了一种(比如上图我们最多能放4个数据,就只有5种情况)。
- (4)这里我进行了一些小改变,为了方便,**head变量存储着队首元素的坐标,而tail变量这里存储为空,但是它“”前面的“”一个位置,存储着队列的尾元素坐标,如下图
1.1.2循环队列的操作(outqueue、inqueue)
用此图为例