1.Stack
一些接口介绍:
1.top():返回栈顶元素的引用
2.push():将元素val压入stack中
3.pop():将stack中尾部的元素弹出
设计一个支持 push
,pop
,top
操作,并能在常数时间内检索到最小元素的栈。
实现 MinStack
类:
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。
1. 0<=pushV.length == popV.length <=1000
2. -1000<=pushV[i]<=1000
3. pushV 的所有数字均不相同
MinStack()
初始化堆栈对象。void push(int val)
将元素val推入堆栈。void pop()
删除堆栈顶部的元素。int top()
获取堆栈顶部的元素。int getMin()
获取堆栈中的最小元素。-
思路:创建两个栈,其中一个用来记录最小值;注意边界条件数值相等时 也要进/出最小栈;考虑为空情况
-
1.2栈的压入、弹出序列
-
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。
1. 0<=pushV.length == popV.length <=1000
2. -1000<=pushV[i]<=1000
3. pushV 的所有数字均不相同
思路:
1.入栈序列入栈
2.持续比较栈顶数据和出栈序列,直到栈为空/不匹配
1.3模拟实现stack:
2.Queue
一些接口介绍:
1.front() 返回队头元素的引用
2.back() 返回队尾元素的引用
3.push() 在队尾将元素val入队列
2.1模拟实现queue
3.Priority_queue(优先级队列)
3.1简介:
1. 优先队列是一种容器适配器,根据严格的弱排序标准,它的第一个元素总是它所包含的元素
中最大的。
2. 此上下文类似于堆,在堆中可以随时插入元素,并且只能检索最大堆元素(优先队列中位于顶
部的元素)。
3. 优先队列被实现为容器适配器,容器适配器即将特定容器类封装作为其底层容器类,queue
提供一组特定的成员函数来访问其元素。元素从特定容器的“尾部”弹出,其称为优先队列的
顶部。
4. 底层容器可以是任何标准容器类模板,也可以是其他特定设计的容器类。容器应该可以通过
随机访问迭代器访问,并支持以下操作:
empty():检测容器是否为空
size():返回容器中有效元素个数
front():返回容器中第一个元素的引用
push_back():在容器尾部插入元素
pop_back():删除容器尾部元素
5. 标准容器类vector和deque满足这些需求。默认情况下,如果没有为特定的priority_queue
类实例化指定容器类,则使用vector。
6. 需要支持随机访问迭代器,以便始终在内部保持堆结构。容器适配器通过在需要时自动调用算法函数make_heap、push_heap和pop_heap来自动完成此操作。
3.2 priority_queue的使用
优先级队列默认使用vector作为其底层存储数据的容器,在vector上又使用了堆算法将vector中
元素构造成堆的结构,因此priority_queue就是堆,所有需要用到堆的位置,都可以考虑使用
priority_queue。注意:默认情况下priority_queue是大堆。

3.3模拟实现priority_queue
4.容器适配器
4.1简介:
适配器是一种设计模式,
该种模式是将一个类的接口转换成客户希望的另外一个接口
(Stack-Queue-Priority_queue三者底层都是容器适配器(六大组件之一))

4.2 deque的简单介绍(了解)
4.2.1 deque
的原理(可以理解为list和vector的融合,但有缺陷)
deque(
双端队列
)
:是一种双开口的
"
连续
"
空间的数据结构
,双开口的含义是:可以在头尾两端
进行插入和删除操作,且时间复杂度为
O(1)
,与
vector
比较,头插效率高,不需要搬移元素;与
list
比较,空间利用率比较高。
deque
并不是真正连续的空间,而是由一段段连续的小空间拼接而成的,实际
deque
类似于一个
动态的二维数组
双端队列底层是一段假象的连续空间,实际是分段连续的,为了维护其
“
整体连续
”
以及随机访问
的假象,落在了
deque
的迭代器身上,
因此
deque
的迭代器设计就比较复杂,如下图所示:
deque
缺陷:不适合遍历,因为在遍历时,
deque
的迭代器要频繁的去检测其
是否移动到某段小空间的边界,导致效率低下