stack容器和queue容器
关于栈与队列是个什么玩意,数据结构应该都讲过。
如果没学过数据结构的话,就这么理解:栈与队列本质上就是数组(或链表),但这个数组大部分内容都被藏起来了,你能访问的内容只有:
1.栈,只能访问数组末尾,添加元素也只能添加在数组末尾(在栈中一般称为栈顶)
2.队列,只能访问数组头和尾,添加元素只能添加在末尾,删除元素只能删除头(队尾、队首)
在C++中,需要包含头文件:
#include <stack>
#include <queue>
创建栈与队列:
stack<int> stk;
queue<int> que;
插入元素:
stk.push(2);
que.push(2);
删除元素:
stk.pop();
que.pop();
得到栈顶/队首队尾元素:
cout << stk.top();
cout << que.front();
cout << que.back();
判断栈与队列是否为空,获得栈与队列当前的大小:
stk.size();
stk.empty();
que.size();
que.empty();
deque双向队列
简单来说,你把这玩意当做栈和队列的结合体。
可以头插、头删、尾插、尾删多种操作。
在C++中,需要包含头文件:
#include <deque>
创建栈与队列:
deque<int> deq;
尾插、头插元素:
deq.push_back(3);
deq.push_front(4);
尾删、头删元素:
deq.pop_back();
deq.pop_front();
得到队首队尾元素:
cout << deq.front();
cout << deq.back();
判断栈与队列是否为空,获得栈与队列当前的大小:
deq.size();
deq.empty();
priority_queue优先队列
优先队列是个什么玩意?
简单来说,就是在将元素加入队列的时候,容器会自动帮你进行一次排序,默认是最小元素排在队尾(也可以称为大顶堆)。这样的话,每次pop弹出队伍中的元素的时候,一定是弹出最大值。
同时,优先队列我们也可以称之为堆,被弹出的数据称为堆顶。
包含头文件:
#include <queue>
简单操作例:
priority_queue<int> pque;
pque.push(8);
pque.push(2);
pque.push(4);
cout << pque.top() << endl;
pque.pop();
cout << pque.top() << endl;
pque.pop();
cout << pque.top() << endl;
pque.pop();
虽然我依次加入的是8、2、4元素,但它会在里面自动排成8、4、2。
如果想要小顶堆的话,意味着放在队尾(堆底)的数据应该是最大的,这时候我们又要堂堂请出我们几节课前面才见过的greater<int>了,注意没带括号。
priority_queue<int, vector<int>, greater<int>> pque;
pque.push(8);
pque.push(2);
pque.push(4);
cout << pque.top() << endl;
pque.pop();
cout << pque.top() << endl;
pque.pop();
cout << pque.top() << endl;
pque.pop();
第一个参数是存储int类型,第二个参数是表示这个优先队列底层是使用vector<int>容器实现,第三个参数是传入的比较器。如果目标是大顶堆的话,二三参数都可以不传。
同理,优先队列同样可以自己写一个比较器传进来。
优先队列可以完成此题目:
单调栈和单调队列
什么叫单调栈和单调队列?
简单来说,就是我要在栈或者队列里面放的元素一定是单调的(可以递增也可以递减),如果当前元素放入后满足单调条件就正常放入,不满足单调条件的话就将栈或者队列里面的元素逐个弹出,直到能把当前元素放入了,然后再将当前元素放入。