6)stack和queue容器,栈与队列总结

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>容器实现,第三个参数是传入的比较器。如果目标是大顶堆的话,二三参数都可以不传。

同理,优先队列同样可以自己写一个比较器传进来。

优先队列可以完成此题目:

347. 前 K 个高频元素 - 力扣(LeetCode)

单调栈和单调队列

什么叫单调栈和单调队列?

简单来说,就是我要在栈或者队列里面放的元素一定是单调的(可以递增也可以递减),如果当前元素放入后满足单调条件就正常放入,不满足单调条件的话就将栈或者队列里面的元素逐个弹出,直到能把当前元素放入了,然后再将当前元素放入。

42. 接雨水 - 力扣(LeetCode)

84. 柱状图中最大的矩形 - 力扣(LeetCode)

239. 滑动窗口最大值 - 力扣(LeetCode)

  • 12
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值