这是C++算法基础-数据结构专栏的第二十三篇文章,专栏详情请见此处。
引入
队列是一种常用的一种线性数据结构。它多用于在BFS(Breadth First Search,宽(广)度优先搜索)中存储数据。
下面我们就来讲队列的实现。
定义
队列(queue)是一种具有「先进入队列的元素一定先出队列」性质的表。由于该性质,队列通常也被称为先进先出(first in first out)表,简称 FIFO 表。
过程
队列,一听这个名字,我们就会想起排队时的情景:先进来排队的人会先从另一边出来,这就叫先进先出,队列就是这样的一种数据结构。
我们接下来要学习五种队列的最主要操作:构建,插入(写入)数据、删除数据、取队头值、判断队列是否为空。
构建队列
我们先定义一个数组,用来表示队列,接着还需要两个变量
和
,用来表示队头和队尾。刚开始
,
。
Q:为什么刚开始要
,
呢?
A:这是整个队列的实现的重要一点,理解了它就能把整个模拟队列理解。当队列中只有一个元素时,这个元素即是队头也是队尾,所以
和
都要指向此元素,所以当队列为空时,就必须
。当然,这只是我习惯上的做法,若你初始时
,那么就意味着
指向队列中最后一个元素的后一个位置,方法是可以灵活变换的。
向队尾插入(写入)数据
先在队尾进行数据赋值,然后将。
从队头弹出数据
直接,使队头减少一层。
Q:将队头减少一层,队列中还有刚刚的数据,直接做会不会有问题呢?
A:没有关系,将队头减少一层,就无法访问刚才的数据了。所以,直接操作队头就可以实现了。
取队头值
输出的值即可。
判断队列是否为空
判断队头和队尾的关系,若,说明队列为空,反之也成立。
值得一提的是,y总在常用代码模板2——数据结构中给出了一种循环队列的实现方式,这里我就不讲解了,只会将代码整理并展现出来。
性质
时间复杂度
上述关于队列的操作,时间复杂度都是的。
代码
下面给出队列的实现代码:
1.普通队列:int que[N],hh=0,tt=-1;void push(int x){que[++tt]=x;
}void pop(){hh++;
}int top(){return que[hh];
}bool empty(){if(hh>tt) return 1;elsereturn 0;
}--------------------------------------------------2.循环队列:int que[N],hh=0,tt=0;void push(int x){que[tt++]=x;if(tt==N)tt=0;
}void pop(){hh++;if(hh==N)hh=0;
}int top(){return que[hh];
}bool empty(){if(hh==tt) return 1;elsereturn 0;
}
代码解释
第一行的各种变量和数组已经在前面讲解了,这里不再详细讲解;push()函数的作用是向队尾插入(写入)数据;pop()函数的作用是从队头弹出数据;top()函数的作用是取队头值;empty()函数的作用是判断队列是否为空。第二种循环队列的解释也是一样的。
上一篇-表达式求值问题的实现 C++算法基础专栏文章 下一篇-单调栈的实现
每周六更新一篇文章,内容一般是自己总结的经验或是在其他网站上整理的优质内容
点个赞,关注一下呗~