今天学习了栈的C++实现,跟单链表很像:
push相当于单链表在第一个位置插入元素;
pop相当于单链表在第一个位置删除元素;
空栈只有头结点,第9行表示若不为空栈则删除除头结点以外的所有结点。
3、清空栈(保留头结点)
6、pop操作(释放第一个结点后,显示该结点的数据元素)
7、处理栈(删除包括头结点)
priority_queue属于容器适配器,它也就是我们常常提到的优先级队列
另外在一些算法相关的书籍中提到的大顶堆、小顶堆等数据结构也是指priority_queue
priority_queue定义了一个元素有序排列的队列,默认队列头部的元素优先级最高
因为它是一个队列,所以只能访问第一个元素,这也意味着优先级最高的元素总是第一个被处理
但是如何定义“优先级”完全取决于我们自己(如果一个优先级队列记录的是医院里等待接受急救的病人,那么病人病情的严重性就是优先级)
第一个参数是存储对象的类型
第二个参数是存储元素的底层容器(可缺省,默认使用vector)
第三个参数是函数对象,它定义了一个用来决定元素顺序的断言(可缺省,默认大顶堆)模板参数的中的函数对象可以不写()
其中第二个参数存储元素的底层容器
可以是满足priority_queue所需要操作的任何底层容器,一般来说,可选vector和deque
其中第三个参数决定元素优先级的函数对象
可以是标准库中定义好的一些比较仿函数,也可以是自定义的其他仿函数。其中默认是标准库中提供的less<T>
函数——对应获得一个大顶堆,如果想获得一个小顶堆,可以改用greater<T>
函数
//默认是一个使用vec作为底层容器的大顶堆
初始化列表中的序列可以来自于任何容器,并且不需要有序,优先级队列会对它们进行排序
priority_queue构造函数的第一个参数是一个用来对元素排序的函数对象,第二个参数是一个提供初始元素的容器
注意这里说的是priority_queue的构造函数的参数,而不是模板参数(前面第2部分priority_queue的代码原型
中讲的是priority_queue的模板参数)
//在队列中用函数对象对vector元素的副本排序
//而且,构造函数的函数对象参数需要加()
push(const T& obj):将obj的副本放到容器的适当位置,这通常会包含一个排序操作
push(T&& obj):将obj放到容器的适当位置,这通常会包含一个排序操作
为了维持优先顺序,通常需要一个排序操作
作用与push()函数类似,但是效率比push高一些
priority_queue没有迭代器,如果想要访问全部的元素,比如说,列出或复制它们,需要使用pop()函数来访问
但是pop()函数会导致元素弹出队列,遍历之后会将队列清空
如果想在进行这样的操作后,还能保存它的元素,需要先把它复制一份
和参数中队列的元素进行交换,所包含对象的类型必须相同
以下示例出自leetcode:347题“前K个高频元素” 官方解法
//其中decltype进行类型推导,推导函数对象的类型