本篇文章介绍c++中关于队列的stl相关方法及概念介绍,例举3个经典算法题
一、queue
队列,常用方法:
- size_type size()
- bool empty()
- void push(value_type a)
- void pop()
- int back()
- int front()
上图表示单向队列,push() = push_back(), pop = pop_back()(这里的等于表示意近)
二、deque
双向队列,常用方法:
- size_type size()
- bool empty()
- void push_back(value_type a)
- void pop_back()
- void push_front(value_type a)
- void pop_front()
- int back()
- int front()
上图表示双向队列,比如当push_back(1)时队列就变为x,y,1,根据图很好理解
经典例题:
求队列最大值,滑动窗口最大值,很经典的两道题,也很类似
这里举例给出求队列最大值的c++代码
class MaxQueue {
queue<int> q1;
deque<int> q2;
public:
MaxQueue() {
}
int max_value() {
if(q1.empty()) return -1;
return q2.front();
}
void push_back(int value) {
q1.push(value);
while(!q2.empty() && value>=q2.back()){
q2.pop_back();
}//q2的头部总是当前q1的最大值
q2.push_back(value);
}
int pop_front() {
if(q1.empty()) return -1;
int temp = q1.front();
q1.pop();
if(temp == q2.front()) q2.pop_front();
return temp;
}
};
/**
* Your MaxQueue object will be instantiated and called as such:
* MaxQueue* obj = new MaxQueue();
* int param_1 = obj->max_value();
* obj->push_back(value);
* int param_3 = obj->pop_front();
*/
三、priority_queue
通常用于表示大顶堆、小顶堆
1.初始化方法:
- //升序队列
- priority_queue <int,vector<int>,greater<int> > q;
- //降序队列
- priority_queue <int,vector<int>,less<int> >q;
- //数据类型,容器类型,排序方式(可以调用,也可以自己实现,类似于sort()的最后一个参数)
- //记忆方式采取右边的为堆顶元素,比如less为a<b,b为堆顶元素,即为大顶堆
- //默认构造:priority_queue<int> q;即为大顶堆
2.常用方法:
- top 访问队头元素
- empty 队列是否为空
- size 返回队列内元素个数
- push 插入元素到队尾 (并排序)
- emplace 原地构造一个元素并插入队列
- pop 弹出队头元素
- swap 交换内容
类似于栈的方法
3. 经典例题
大顶堆小顶堆的经典例题不用多说,这里提一个:n个元素求top k,面试常考题