C++ 栈与队列

一、C++ 栈

1、stack的定义

stack<typename> name;
其中,typename可以是任何基本类型,例如 intdoublechar、结构体等,也可以是STL标准容器,例如vectorsetqueue等。

2、stack容器内元素的访问

  • push()
    push(x) 将 x 进行入栈,无返回值,时间复杂度为 O(1)。
  • pop()
    pop()用以弹出栈顶元素,无返回值,时间复杂度为 O(1)。
  • top()
    top()返回栈顶元素,时间复杂度为 O(1)。
  • empty()
    empty() 检测 stack 是否为空,返回true 则空,返回 false 则非空 。时间复杂度为 O(1)。
  • size()
    size() 返回 stack 中元素的个数,时间复杂度为 O(1)。

二、C++ 队列

1、queue的定义

queue<typename> name;
其中,typename可以是任何基本类型,例如 intdoublechar、结构体等,也可以是STL标准容器,例如vectorsetqueue等。

2、queue容器内元素的访问

  • push()
    push(x) 将 x 进行入队,无返回值,时间复杂度为 O(1)。
  • pop()
    pop()令队首元素出队,无返回值,时间复杂度为 O(1)。
  • front()back()
    front()back()可以分别获得队首元素和队尾元素,时间复杂度为 O(1)。
  • empty()
    empty() 检测 queue 是否为空,返回true 则空,返回 false 则非空 。时间复杂度为 O(1)。
  • size()
    size() 返回 queue 中元素的个数,时间复杂度为 O(1)。

三、C++ 双端队列

1、deque介绍

dequedouble ended queue即双端队列,是一种在两端均可以扩展或者收缩的序列化容器。
deque可以在头部和尾部进行插入和删除操作。

2、deque的定义

deque<typename> name;
其中,typename可以是任何基本类型,例如 intdoublechar、结构体等,也可以是STL标准容器,例如vectorsetqueue等。

3、deque容器内元素的访问

  • push_back()
    deque尾部添加一个元素
  • push_front()
    deque头部添加一个元素
  • pop_back()
    删除deque尾部的一个元素
  • pop_front()
    删除deque头部的一个元素
  • front()back()
    front()返回deque第一个元素,back()返回deque最后一个元素
  • empty()
    empty()方法用来判断deque中是否有元素,如果有元素,返回false;如果没有元素,返回true。即为空返回true,非空返回false
  • size()
    要想知道deque中有多少元素,使用deque.size()方法,作用是返回deque中元素的个数。

四、C++ 优先级队列

1、priority_queue介绍

  • 既然是队列那么先要包含头文件#include <queue>, 他和queue不同的就在于我们可以自定义其中数据的优先级, 让优先级高的排在队列前面,优先出队。优先队列具有队列的所有特性,包括基本操作,只是在这基础上添加了内部的一个排序,它本质是一个堆实现的。
    在这里插入图片描述

2、优先队列的成员函数

  • 与普通队列相同

3、priority_queue的定义

  • priority_queue<Type, Container, Functional>
    • Type:数据类型
    • Container :容器类型(Container必须是用数组实现的容器,比如vector,deque等等,但不能用 list。STL里面默认用的是vector)
    • Functional: 就是比较的方式,当需要用自定义的数据类型时才需要传入这三个参数,使用基本数据类型时,只需要传入数据类型,默认是大顶堆

4、大堆顶与小堆顶

  • 大堆顶(降序)
    //构造一个空的优先队列(此优先队列默认为大顶堆)
    priority_queue<int> big_heap;   
    //另一种构建大顶堆的方法
    priority_queue<int,vector<int>,less<int> > big_heap2;   
    
  • 小堆顶(升序)
    //构造一个空的优先队列,此优先队列是一个小顶堆
    priority_queue<int,vector<int>,greater<int> > small_heap;   
    
    需要注意的是,如果使用less和greater,需要头文件:#include <functional>

5、一个实例(map小堆顶)

class Solution {
public:
    /*cmp可以作为priority_queue<>中的第三个参数*/
    struct cmp{
        /*注意这里使用到了仿函数*/
        bool operator()(pair<int,int> p1,pair<int,int> p2){
            /*map中value越大优先级越高,所以是个小堆顶*/
            return p1.second>p2.second;
        }
    };


    vector<int> topKFrequent(vector<int>& nums, int k) {
        unordered_map<int,int> mp;
        for(int i=0;i<nums.size();i++){
            mp[nums[i]]++;
        }
        /*注意看优先级队列的定义方式,这里调用了一个自定义的排序算法*/
        priority_queue<pair<int,int>,vector<pair<int,int>>,cmp> pri_que;
        
        for(auto it=mp.begin();it!=mp.end();it++){
            pri_que.push(*it);
            if(pri_que.size()>k){
                pri_que.pop();
            }
        }
        
        vector<int> result;
        for(int i=0;i<k;i++){
            result.push_back(pri_que.top().first);
            pri_que.pop();
        }

        return result;
    }
};
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Elec Liu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值