目录
参考资料
代码随想录
(一)栈和队列的基础知识
1.C++中的stack是容器吗?
a.C++中容器有哪些特点
b.栈有哪些特点
c.总结栈为什么不是容器
STL库是C++中借助模板把常用的数据结构和算法分离的库
基本组件除了容器还有迭代器算法和函数对象,算法运行时通过迭代器对容器进行访问;
简单的理解容器,它就是一些模板类的集合,但和普通模板类不同的是,容器中封装的是组织数据的方法(也就是数据结构)。
栈本身不归类为容器,但是栈是以底层容器来完成所有功能的。栈的底层实现可以是vector、deque、list,栈归类为容器适配器。
栈提供push和pop等接口,所有元素必须符合先进后出的规则,不提供走访功能,也不提供迭代器。不像set或map提供迭代器iterator来遍历所有元素。
2.应用
匹配类型的题目
(二)栈和队列的通用操作
1.栈的基本操作
push(x)——将一个元素放入栈的顶部
pop()——从栈顶弹出元素
peek()——返回栈最前端的元素
empty()——返回栈是否为空
2.队列的基本操作
push(x)——将一个元素放入队列的尾部
pop()——从队列尾部移除元素
peek()——返回队列首部的元素
empty()——返回队列是否为空
(三)栈和队列的相关例题
1.用栈实现队列
用栈实现队列
用两个栈来模拟队列的两头(定义两个栈);
栈和队列压入的方式一致,弹出的方式倒序(需要对栈是否空进行判断)
2.用队列实现栈
用队列实现栈、
用两个队列来模拟栈,队列先进先出,栈先进后出,把队列后出的数据放入另一个队列先进行缓存。
3.有效的括号
有效的括号
不匹配情况 | 解决措施 |
---|---|
缺少右括号 | 遍历字符串匹配,发现栈不为空。 |
左右括号类型不匹配 | 遍历字符串,栈中没有相匹配的字符 |
缺少左括号 | 遍历没有结束,栈中已经空了 |
有限字符串的顺序也有要求,所以对应着也有一个小技巧,只需要看
4.删除字符串中所有与相邻重复项
删除字符串中所有与相邻重复项
应用:消消乐
函数的递归调用:每一次递归调用都会把函数的局部变量、参数值返回地址等压入调用栈中。
把字符串顺序放到一个栈中,相同的话栈就弹出,最后栈中剩下的元素都是相邻不相同的元素。
5.逆波兰表达式求值
逆波兰表达式求值
逆波兰表达式:是一种后缀表达式,所谓后缀就是指算符写在后面。
优点:
去掉括号后表达式无歧义,上式即便写成 1 2 + 3 4 + * 也可以依据次序计算出正确结果。
适合用栈操作运算:遇到数字则入栈;遇到算符则取出栈顶两个数字进行计算,并将结果压入栈中。
6.滑动窗口最大值
滑动窗口最大值
保持单调队列里单调递减,
7.前K个高频元素
前K个高频元素
要统计元素出现的频率——map;
对频率排序;
找出前K个高频元素;
相关知识:对容器进行排序,容器适配器就是优先级队列
堆是一个完全二叉树:数中每个结点的值都不小于(或不大于)左右子孩子的值。大顶堆(堆头是最大的元素),小顶堆(堆头是最小的元素)